当前位置: 首页 > 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());}});}
});

相关文章:

  • c++ map
  • Database: Text数据转化为向量. (高维往低维映射)
  • 串口通信(1)-硬件知识
  • 深度学习还可以从如下方面进行创新!!
  • SQL Server 2017数据库window server服务器改名操作
  • vue3快速上手
  • LED透镜粘接UV胶是一种特殊的UV固化胶
  • 14:00面试,14:06就出来了,问的问题有点变态。。。
  • Could not resolve all dependencies for configuration ‘:app:androidApis‘.
  • 【1day】金和OA某接口存在未授权访问漏洞
  • 【华为数据之道学习笔记】1-2华为数字化转型与数据治理
  • Red Hat Satellite - 导入订阅清单
  • Linux0.11内核源码解析-string待更新
  • 面试题目总结(三)
  • HTML5 Audio/Video 标签、属性、方法、事件汇总
  • Android单元测试 - 几个重要问题
  • javascript面向对象之创建对象
  • JavaScript实现分页效果
  • JS笔记四:作用域、变量(函数)提升
  • Mac转Windows的拯救指南
  • MySQL主从复制读写分离及奇怪的问题
  • Next.js之基础概念(二)
  • 包装类对象
  • 不上全站https的网站你们就等着被恶心死吧
  • 基于 Babel 的 npm 包最小化设置
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 坑!为什么View.startAnimation不起作用?
  • 盘点那些不知名却常用的 Git 操作
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​浅谈 Linux 中的 core dump 分析方法
  • #QT(QCharts绘制曲线)
  • (23)mysql中mysqldump备份数据库
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (笔试题)合法字符串
  • (三)elasticsearch 源码之启动流程分析
  • (十一)c52学习之旅-动态数码管
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (转)负载均衡,回话保持,cookie
  • (转)详解PHP处理密码的几种方式
  • (转载)Linux网络编程入门
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .NET Core 实现 Redis 批量查询指定格式的Key
  • .NET Micro Framework 4.2 beta 源码探析
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .Net6使用WebSocket与前端进行通信
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .NET构架之我见
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET中GET与SET的用法
  • .net中的Queue和Stack
  • .php文件都打不开,打不开php文件怎么办
  • ;号自动换行
  • @EnableWebMvc介绍和使用详细demo
  • [.NET 即时通信SignalR] 认识SignalR (一)