今天遇到了一个上传图片接口,后端获取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
,因为它通常用于表单提交,特别是包含文件上传的表单。
步骤
创建MediaType:
MediaType mediaType = MediaType.parse("image/jpeg");
MediaType
用于描述文件类型,这里我们上传的是JPEG格式的图片。
创建RequestBody:
RequestBody fileBody = RequestBody.create(mediaType, photoFile);
RequestBody
用于封装待上传的文件数据。
创建MultipartBody:
RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", photoFile.getName(), fileBody) .build();
MultipartBody
用于构建多部分表单请求,这里添加了文件部分。
添加请求头:
我也不知道他为什么要把参数放在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
。
发送请求:
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:"); } });
end