(原创)接口隔离原则封装一个自己的网络请求库(五)文件上传功能

下载文件写完了

接下来就是上传文件了

继续完善!

首先,在我们的基础接口INetManager里新增方法postFile

复写这个方法用来上传文件

代码如下:

/**
 * Created by lenovo on 2019/11/8.
 * 网络请求工具类
 */
public interface INetManager {

    /**
     * @param url      请求网址
     * @param callback 回调
     * @param tag      请求的tag
     */
    void get(String url, INetGetCallBack callback, Object tag);

    /**
     * post请求
     *
     * @param url
     * @param headersParams head
     * @param params        参数
     * @param callback      回调
     * @param tag           请求的tag
     */
    void post(String url, Map<String, String> headersParams, Map<String, String> params, INetPostCallBack callback, Object tag);

    /**
     * 上传文件
     *
     * @param url
     * @param fileKey  文件的key
     * @param file     要上传的文件
     * @param params   参数
     * @param callback 回调
     * @param tag      tag
     */
    void postFile(String url, String fileKey, File file, Map<String, String> params, INetPostFileCallBack callback, Object tag);


    /**
     * 下载文件
     *
     * @param url
     * @param file     下载的文件
     * @param callback 回调
     * @param tag      tag
     */
    void downFile(String url, File file, INetDownFileCallBack callback, Object tag);


    /**
     * 取消请求
     *
     * @param tag
     */

    void cancel(Object tag);


}

大概介绍一下这个方法的几个参数

url就是请求的地址

filekey是你把文件作为参数上传时的key值

file是你要上传的文件

callback是回调

tag是请求标记

INetPostFileCallBack代码如下:

/**
 * Created by lenovo on 2019/11/9.
 * 上传文件的返回结果
 */

public interface INetPostFileCallBack {
    void success(String string);

    void failed(Throwable throwable);
}

这里就没有加进度监听的方法了

有需要的可以自己去完善

然后,就是关键的OkhttpNetManager里的功能实现了

这边也直接上代码吧

    @Override
    public void postFile(String url, String fileKey, File file, Map<String, String> params, final INetPostFileCallBack callback, Object tag) {
        if (!file.exists()) {
            //文件不存在
            Log.d("print", "postFile: 要上传的文件不存在");
            return;
        }
        // form 表单形式上传
        MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM);
        // MediaType.parse() 里面是上传的文件类型。不清楚的可以写application/octet-stream
        //图片的类型就可以写image/*这种
        RequestBody body = RequestBody.create(MediaType.parse("application/octet-stream"), file);
        // 参数分别为, 请求key ,文件名称 , RequestBody
        builder.addFormDataPart(fileKey, file.getName(), body);
        if (params != null) {
            // map 里面是请求中所需要的 key 和 value
            for (Map.Entry<String, String> entry : params.entrySet()) {
                builder.addFormDataPart(entry.getKey(), entry.getValue());
            }
        }
        MultipartBody multipartBody = builder.build();
        Request request = new Request.Builder().url(url).post(multipartBody).tag(tag).build();
        sokHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, final IOException e) {
                if (call.isCanceled()) {
                    return;
                }
                //非ui线程
                shandler.post(new Runnable() {
                    @Override
                    public void run() {
                        //ui线程
                        callback.failed(e);
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                try {
                    if (call.isCanceled()) {
                        return;
                    }
                    final String string = response.body().string();
                    //非ui线程
                    shandler.post(new Runnable() {
                        @Override
                        public void run() {
                            //ui线程
                            callback.success(string);
                        }
                    });
                } catch (Throwable e) {
                    e.printStackTrace();
                    callback.failed(e);
                }
            }
        });


    }

记得加上网络权限和文件读写权限,还需要动态申请读写权限

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

在调用上传文件方法之前

要先创建自己要上传的File对象和filekey

如果有参数,和post方法一样用map传过去

然后是调用

INetClient.getsInstance()
                .getmNetManager()//得到具体网络请求实现类,这里是OkhttpNetManager
                .postFile(url,filekey,file,map参数,回调,tag);

到这里,基本的网络请求功能就完成了

以后如果有相应的新的需求,这套框架也方便扩展

目前以及完善的功能:

get

post

downfile

postfile

采用的是okhttp来实现。

完结~撒花~!

猜你喜欢

转载自blog.csdn.net/Android_xiong_st/article/details/103066996