使用OkHttp上传本地图片及参数
2023-12-14 21:32:23
下面以一个例子来讲解在项目中如何使用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()); } }); } });
文章来源:https://blog.csdn.net/qq_42618969/article/details/134880506
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!