当前位置: 首页 > news >正文

使用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() {@Overridepublic void onFailure(@NonNull Call call, @NonNull IOException e) {//返回失败的数据hideLoading();Log.e("onFailure img-->>", e.getMessage());}@Overridepublic 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();//切换到主线程中去操作UIrunOnUiThread(new Runnable() {@Overridepublic void run() {//本地封装的图片加载工具类加载已上传成功的图片ImageUtil.loadLocalFile(XXActivity.this, iv_graph, file.getAbsolutePath());}});}
});
http://www.lryc.cn/news/255356.html

相关文章:

  • 无公网IP环境如何SSH远程连接Deepin操作系统
  • 不会代码(零基础)学语音开发(语音控制板载双继电器)
  • 在imx6ull中加入ov5640模块
  • Kafka中的auto-offset-reset配置
  • TCP/IP_整理起因
  • CG-0A 电子水尺水导电测量原理应用于道路积水监测
  • openEuler JDK21 部署 Zookeeper 集群
  • 前端——html拖拽原理
  • JVM 执行引擎篇
  • js中数组对象去重的方法
  • 【送书活动四期】被GitHub 要求强制开启 2FA 双重身份验证,我该怎么办?
  • GO设计模式——13、享元模式(结构型)
  • Linux 网络协议
  • 【C语言】7-32 刮刮彩票 分数 20
  • 交叉验证以及scikit-learn实现
  • css实现头部占一定高度,内容区占剩余高度可滚动
  • redis主从复制模式和哨兵机制
  • WebStorm:Mac/Win上强大的JavaScript开发工具
  • 传世SUN引擎如何安装
  • vue 生命周期
  • 多开工具对应用程序性能的影响与优化
  • G1 GC基本逻辑
  • nvidia安装出现7-zip crc error解决办法
  • (C语言实现)高精度除法 (洛谷 P2005 A/B Problem II)
  • 【AI】Windows环境安装GroundingDINO
  • 【Node.js】基础梳理 6 - MongoDB
  • .NET8 依赖注入
  • Ubuntu18安装(重启黑屏问题)
  • [PyTorch][chapter 4][李宏毅深度学习][Gradient Descent]
  • 利用proteus实现串口助手和arduino Mega 2560的串口通信