使用OkHttp3以Multipart/Form-Data方式上传文件方式
作者:莫翊痕
在开发过程中,使用multipart/form-data进行图片上传是一个常见的需求,本文通过一个实际案例,讲解了如何在项目中添加OkHttp3库依赖,并使用multipart/form-data进行图片上传,首先,介绍了ContentType的概念和常见类型
今天遇到了一个上传图片接口,后端获取file老是为null,仔细一看是ContentType:multipart/form-data,这中方式我用的不多,这边记录下。
准备工作
首先,确保项目已经添加了OkHttp3库的依赖:
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
ContentType概述
ContentType,也称为媒体类型或MIME类型,用于描述网络请求和响应中的内容类型。
以下是一些常见的ContentType:
text/plain:普通文本text/html:HTML文档application/json:JSON数据application/xml:XML数据image/jpeg:JPEG图片image/png:PNG图片multipart/form-data:用于文件上传
本文主要关注multipart/form-data,因为它通常用于表单提交,特别是包含文件上传的表单。
步骤
1.创建MediaType
MediaType mediaType = MediaType.parse("image/jpeg");MediaType用于描述文件类型,这里我们上传的是JPEG格式的图片。
2.创建RequestBody
RequestBody fileBody = RequestBody.create(mediaType, photoFile);
RequestBody用于封装待上传的文件数据。
3.创建MultipartBody
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", photoFile.getName(), fileBody)
.build();MultipartBody用于构建多部分表单请求,这里添加了文件部分。
4.添加请求头
我也不知道他为什么要把参数放在url里面…
Request request = new Request.Builder()
.url("http://xx.xx.x.xx:xxxxx/fileUploadAndDownload/upload?detailNo=1234&noSave=0")
.addHeader("X-Token", token)
.post(requestBody)
.build();这里我们添加了自定义的请求头X-Token。
5.发送请求
OkHttpClient client = new OkHttpClient();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
System.out.println(response.body().string());
}
});通过OkHttpClient发送请求,并处理响应。
完整代码
使用OkHttp3以multipart/form-data方式上传图片的示例代码。
import okhttp3.*;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.Set;
public class UploadImage {
private static final String TAG = "UploadImage";
public static void main(String[] args) {
// 创建MediaType
MediaType mediaType = MediaType.parse("image/jpeg");
// 图片文件路径
File photoFile = new File("path/to/your/photo.jpg");
// 创建RequestBody
RequestBody fileBody = RequestBody.create(mediaType, photoFile);
// 创建MultipartBody
RequestBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", photoFile.getName(), fileBody)
.build();
// 获取自定义请求头
Map<String, String> headers = EasyConfig.getInstance().getHeaders();
String token = headers.get("X-Token");
Set<String> keySet = headers.keySet();
for (String key : keySet) {
Log.i(TAG, "uploadImage: " + headers.get(key));
}
// 创建Request
Request request = new Request.Builder()
.url("http://192.168.6.162:8888/fileUploadAndDownload/upload?detailNo=1234&noSave=0")
.addHeader("X-Token", token)
.post(requestBody)
.build();
// 创建OkHttpClient
OkHttpClient client = new OkHttpClient();
// 发送请求
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (!response.isSuccessful()) {
throw new IOException("Unexpected code " + response);
}
// 处理响应
System.out.println(response.body().string());
}
});
}
}我这边使用的是EasyHttp库,multipart/form-data不知道怎么设置,导致EasyHttp上传不了图片。
所以才用原生的api先学习,这边也贴一下EasyHttp使用multipart/form-data上传图片。
// 创建RequestBody,指定媒体类型和文件
RequestBody fileRequestBody = RequestBody.create(MediaType.parse("image/jpeg"), photoFile);
// 创建MultipartBody.Part,指定字段名和RequestBody
MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", photoFile.getName(), fileRequestBody);
// 构建MultipartBody
MultipartBody requestBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addPart(filePart)
.build();
EasyHttp.post(this)
.api(new UploadApi())
.body(requestBody)
.request(new OnUpdateListener<Void>() {
@Override
public void onUpdateProgressChange(int progress) {
Log.i(TAG, "onUpdateProgressChange: "+progress);
}
@Override
public void onUpdateSuccess(Void result) {
Log.i(TAG, "onUpdateSuccess:");
}
@Override
public void onUpdateFail(Throwable throwable) {
Log.i(TAG, "onUpdateFail:");
}
});总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
