使用OkHttp上传本地图片及参数

下面以一个例子来讲解在项目中如何使用OKHttp来对本地图片做个最简单的上传功能,基本上无封装,只需要简单调用便可(对于OKHttp的引入不再单独做介绍)。

1:构建上传图片附带的参数(params)

复制代码
Map<String, Object> reqData = new HashMap<>();
RequestBody requestFile = RequestBody.create(MediaType.parse("multipart/form-data"), file);
MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", file.getName(), requestFile);

其中reqData中是需要传入的参数,如接口请求token,时间戳,版本号等。然后构建RequestBody,表示上传类型,这里以form表单形式提交,当然也可以以Json格式提交,只要和后台约定好便可。然后构建filePart,有单个图片文件和多个文件图片选项,多个文件也是封装在MultipartBody.Part中的,这里以单个文件为例。

2:第二步,把参数与图片数据封装到心情求体里。这里ReqData中便是传递需要的参数,这里对传递过来的参数重新取出以键值对方式构建。

复制代码
MediaType MEDIA_TYPE_PNG = MediaType.parse("multipart/form-data");
MultipartBody multipartBody = new MultipartBody.Builder()
        .setType(MEDIA_TYPE_PNG)
        .addFormDataPart("token", reqData.get("token").toString())
        .addFormDataPart("ts", reqData.get("ts").toString())
        .addFormDataPart("rand", reqData.get("rand").toString())
        .addFormDataPart("platform", reqData.get("platform").toString())
        .addFormDataPart("version", reqData.get("version").toString())
        .addFormDataPart("source", "appimg")
        .addPart(filePart)
        .build();

3:发起请求,这里需要注意的有几点:

(1)把上述构建的请求体传到Request中,在OkHttpClient的配置中做简单配置参数。如请求连接时间,读写时间等。

(2)在Request中设置上传URL,就是需要上传的接口详细地址。

(3)在回调函数中接收返回的数据,注意,在回调函数中无论成功还是失败都是默认在子线程中,当我们需要操作UI时需要切换到主线程中,避免发生应用Crash

复制代码
Request.Builder requestBuild = new Request.Builder();
Request request = requestBuild
        .url(UPLOAD_PHOTO_URL)
        .post(multipartBody)
        .build();
OkHttpClient okHttpClient = new OkHttpClient.Builder()
        .connectTimeout(60, TimeUnit.SECONDS)
        .readTimeout(60, TimeUnit.SECONDS)
        .build();
okHttpClient.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(@NonNull Call call, @NonNull IOException e) {
        //返回失败的数据
        hideLoading();
        Log.e("onFailure img-->>", e.getMessage());
    }

    @Override
    public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
        //返回成功的数据
        String newAvatar = response.body().string();
        Log.e("onResponse img-->>", newAvatar);
        hideLoading();
        imageUrl = newAvatar;
        locolPath = file.getAbsolutePath();
        //切换到主线程中去操作UI
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //本地封装的图片加载工具类加载已上传成功的图片
                ImageUtil.loadLocalFile(XXActivity.this, iv_graph, file.getAbsolutePath());
      
            }
        });
    }
});
相关推荐
likuolei6 小时前
Eclipse 代码模板
java·ide·eclipse
好好研究6 小时前
SpringMVC框架 - 异常处理
java·开发语言·spring·mvc
只会写代码6 小时前
JDK8 Lambda 加持:打造优雅通用的对象构建器
java
songroom7 小时前
Rust: 量化策略回测与简易线程池构建(MPMC)
开发语言·后端·rust
摇滚侠7 小时前
Vue 项目实战《尚医通》,完成确定挂号业务,笔记46
java·开发语言·javascript·vue.js·笔记
正在走向自律7 小时前
豆包编程模型Doubao-Seed-Code深度体验,从零开始构建全栈项目的完整指南
java·服务器·数据库·doubao·claude code·火山方舟
钱多多_qdd7 小时前
基础篇:IoC(九):应用上下文ApplicationContext
java·spring
十五年专注C++开发7 小时前
libdatrie: 一个高效的 基于双数组字典树(Double-Array Trie)的C语言函数库
c语言·开发语言·trie
q***55897 小时前
SpringSecurity 实现token 认证
java
合作小小程序员小小店7 小时前
web网页开发,在线%医院诊断管理%系统,基于Idea,html,css,jQuery,java,jsp,ssh,mysql。
java·前端·css·数据库·jdk·html·intellij-idea