当前位置: 首页 > 工具软件 > OkHttpUtils > 使用案例 >

OkhttpUtils文件上传

何升
2023-12-01

一.作为文件体上传文件

Map<String, String> params = new HashMap<>();
        params.put("cylsh", mp4Bean.getLsh());//查验流水号
        params.put("cycs", mp4Bean.getFtpdir());//查验次数
        params.put("cyqxh", cyqxh);//查验区序号
        params.put("spzl", mp4Bean.getId());//视频种类的ID
        /*上传文件*/
        File file = new File(item.getUri());
//        HashMap<String, File> fileHashMap = new HashMap<>();
//        fileHashMap.put("file", new File(item.getUri()));
        LogUtils.v("文件名:" + new File(item.getUri()).getName());
        OkHttpUtils.post().params(params)
//                .files("files", fileHashMap)
                .addHeader("Content-Type", " multipart/form-data")
                .addFile("file", file.getName(), file)
                .url(Constants.getConstants().putVideoFile()).build()
                .connTimeOut(600000)//设置连接超时时间
                .readTimeOut(600000)//socket连接超时时间(必须设置不然容易报错: 
 //java.net.SocketTimeoutException: timeout)
                .execute(new StringCallback() {
                    /*进度的回调接口(这个需要自己重写)*/
                    @Override
                    public void inProgress(float progress, long total, int id) {
                        super.inProgress(progress, total, id);
                        LogUtils.i("进度:" + (int) (progress * 100) +
                                "\n总大小:" + SDUtils.getFormatSize(total));
                        final int result = (int) (progress * 100);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                btn.setText(getString(R.string.loading, result, "%"));
                            }
                        });
                    }

                    @Override
                    public void onError(Call call, Exception e, int id) {
                        ProgressUtil.hide();
                        ToastUtils.show("视频上传失败,原因:" + e);
                        LogUtils.e("视频上传失败,原因:" + e);
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                btn.setText("上传失败");
                            }
                        });
                    }

                    @Override
                    public void onResponse(String response, int id) {
                        ProgressUtil.hide();
                        LogUtils.d("上传文件返的回数据:" + response);
                        DataBean dataBean = GsonUtils.fromJson(response, DataBean.class);
                        if ("00".equals(dataBean.getErrorCode())) {
                            /*上传视频文件成功*/
                            updateStatus(item, btn);

浏览器会自动识别并添加请求头 "Content-Type: multipart/form-data",且参数依然像是表单提交时的那种键值对儿

参考网址:https://blog.csdn.net/luhuiwan1314/article/details/79916682

二.OkhttpUtils单文件上传

public static void upLoadToServer(final Context context, HashMap<String,String >params,final String url, String filePath, final ArrayList<String> list, final HttpCallBackListener listener) {
    if (NetUtils.isConnected(context)) {
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Disposition", "form-data;filename=enctype");
        File file = new File(filePath);
        if (!file.exists()) {
            MyToast.showMessage("文件不存在,请修改文件路径");
            return;
        }
        String filename = file.getName();
        OkHttpUtils.post().params(params)
                .headers(headers)
                .addFile("mFile", filename, file)
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {

                    }

                    @Override
                    public void onResponse(String response, int id) {
                    }
                });
    }
}


三.OkhttpUtils多文件上传

OkhttpUtils多文件上传,addFile中name 要变,要不只是传第一张图片后面的不传,类似Map键值存储
public PostFormBuilder addFile(String name, String filename, File file)
{
    files.add(new FileInput(name, filename, file));
    return this;
}

public static void upLoadToServer(final Context context, final String url, final Map<String, String> params, final ArrayList<String> list, final HttpCallBackListener listener) {
    if (NetUtils.isConnected(context)) {
        Map<String, String> headers = new HashMap<>();
        headers.put("Content-Disposition", "form-data;filename=enctype");
        PostFormBuilder builder = OkHttpUtils.post();
        builder.url(url);
        for (int i = 0; i < list.size(); i++) {
            File file = new File(list.get(i));
            if (!file.exists()) {
                MyToast.showMessage("文件不存在,请修改文件路径");
                return;
            }
            String filename = file.getName();
            builder.addFile("mFile"+i, filename, file);
        }

        builder.params(params)
                .headers(headers)
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        
                    }

                    @Override
                    public void onResponse(String response, int id) {
                    }
                });
    }
}

四.OkHttpUtils参数设置

OkHttpUtils.get(Urls.URL_METHOD) // 请求方式和请求url, get请求不需要拼接参数,支持get,post,put,delete,head,options请求
    .tag(this)               // 请求的 tag, 主要用于取消对应的请求
    .connTimeOut(10000)      // 设置当前请求的连接超时时间
    .readTimeOut(10000)      // 设置当前请求的读取超时时间
    .writeTimeOut(10000)     // 设置当前请求的写入超时时间
    .cacheKey("cacheKey")    // 设置当前请求的缓存key,建议每个不同功能的请求设置一个
    .cacheMode(CacheMode.FIRST_CACHE_THEN_REQUEST) // 缓存模式,详细请看第四部分,缓存介绍
    .setCertificates(getAssets().open("srca.cer")) // 自签名https的证书,可变参数,可以设置多个
    .addInterceptor(interceptor)            // 添加自定义拦截器
    .headers("header1", "headerValue1")     // 添加请求头参数
    .headers("header2", "headerValue2")     // 支持多请求头参数同时添加
    .params("param1", "paramValue1")        // 添加请求参数
    .params("param2", "paramValue2")        // 支持多请求参数同时添加
    .params("file1", new File("filepath1")) // 可以添加文件上传
    .params("file2", new File("filepath2")) // 支持多文件同时添加上传
    .addUrlParams("key", List<String> values)  //这里支持一个key传多个参数
    .addFileParams("key", List<File> files) //这里支持一个key传多个文件
    .addFileWrapperParams("key", List<HttpParams.FileWrapper> fileWrappers) //这里支持一个key传多个文件
    .addCookie("aaa", "bbb")                // 这里可以传递自己想传的Cookie
    .addCookie(cookie)                    // 可以自己构建cookie
    .addCookies(cookies)                    // 可以一次传递批量的cookie

 

 类似资料: