使用OkHttp3以Multipart/Form-Data方式上傳文件方式
今天遇到了一個(gè)上傳圖片接口,后端獲取file老是為null,仔細(xì)一看是ContentType:multipart/form-data,這中方式我用的不多,這邊記錄下。
準(zhǔn)備工作
首先,確保項(xiàng)目已經(jīng)添加了OkHttp3庫的依賴:
implementation 'com.squareup.okhttp3:okhttp:4.9.0'
ContentType概述
ContentType,也稱為媒體類型或MIME類型,用于描述網(wǎng)絡(luò)請(qǐng)求和響應(yīng)中的內(nèi)容類型。
以下是一些常見的ContentType:
text/plain
:普通文本text/html
:HTML文檔application/json
:JSON數(shù)據(jù)application/xml
:XML數(shù)據(jù)image/jpeg
:JPEG圖片image/png
:PNG圖片multipart/form-data
:用于文件上傳
本文主要關(guān)注multipart/form-data
,因?yàn)樗ǔS糜诒韱翁峤?,特別是包含文件上傳的表單。
步驟
1.創(chuàng)建MediaType
MediaType mediaType = MediaType.parse("image/jpeg");
MediaType
用于描述文件類型,這里我們上傳的是JPEG格式的圖片。
2.創(chuàng)建RequestBody
RequestBody fileBody = RequestBody.create(mediaType, photoFile);
RequestBody
用于封裝待上傳的文件數(shù)據(jù)。
3.創(chuàng)建MultipartBody
RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", photoFile.getName(), fileBody) .build();
MultipartBody
用于構(gòu)建多部分表單請(qǐng)求,這里添加了文件部分。
4.添加請(qǐng)求頭
我也不知道他為什么要把參數(shù)放在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();
這里我們添加了自定義的請(qǐng)求頭X-Token
。
5.發(fā)送請(qǐng)求
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
發(fā)送請(qǐng)求,并處理響應(yīng)。
完整代碼
使用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) { // 創(chuàng)建MediaType MediaType mediaType = MediaType.parse("image/jpeg"); // 圖片文件路徑 File photoFile = new File("path/to/your/photo.jpg"); // 創(chuàng)建RequestBody RequestBody fileBody = RequestBody.create(mediaType, photoFile); // 創(chuàng)建MultipartBody RequestBody requestBody = new MultipartBody.Builder() .setType(MultipartBody.FORM) .addFormDataPart("file", photoFile.getName(), fileBody) .build(); // 獲取自定義請(qǐng)求頭 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)); } // 創(chuàng)建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(); // 創(chuàng)建OkHttpClient OkHttpClient client = new OkHttpClient(); // 發(fā)送請(qǐng)求 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); } // 處理響應(yīng) System.out.println(response.body().string()); } }); } }
我這邊使用的是EasyHttp庫,multipart/form-data不知道怎么設(shè)置,導(dǎo)致EasyHttp上傳不了圖片。
所以才用原生的api先學(xué)習(xí),這邊也貼一下EasyHttp使用multipart/form-data上傳圖片。
// 創(chuàng)建RequestBody,指定媒體類型和文件 RequestBody fileRequestBody = RequestBody.create(MediaType.parse("image/jpeg"), photoFile); // 創(chuàng)建MultipartBody.Part,指定字段名和RequestBody MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", photoFile.getName(), fileRequestBody); // 構(gòu)建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:"); } });
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
JAVA設(shè)置手動(dòng)提交事務(wù),回滾事務(wù),提交事務(wù)的操作
這篇文章主要介紹了JAVA設(shè)置手動(dòng)提交事務(wù),回滾事務(wù),提交事務(wù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04以用戶名注冊(cè)為例分析三種Action獲取數(shù)據(jù)的方式
這篇文章主要介紹了以用戶名注冊(cè)為例分析三種Action獲取數(shù)據(jù)的方式的相關(guān)資料,需要的朋友可以參考下2016-03-03Java使用Soap方式調(diào)用WebService接口代碼示例
Java調(diào)用WebService接口是指通過Java語言來訪問并與WebService進(jìn)行交互,WebService是一種基于Web的服務(wù)架構(gòu),它通過標(biāo)準(zhǔn)的XML和HTTP協(xié)議來提供服務(wù),這篇文章主要給大家介紹了關(guān)于Java使用Soap方式調(diào)用WebService接口的相關(guān)資料,需要的朋友可以參考下2024-03-03java對(duì)象轉(zhuǎn)成byte數(shù)組的3種方法
這篇文章主要為大家詳細(xì)介紹了java對(duì)象轉(zhuǎn)成byte數(shù)組的3種方法,具有一定的參考價(jià)值,感興趣的朋友可以參考一下2018-06-06解決SpringBoot整合Mybatis掃描不到Mapper的問題
這篇文章主要介紹了解決SpringBoot整合Mybatis掃描不到Mapper的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-04-04Java應(yīng)用服務(wù)器之tomcat部署的詳細(xì)教程
這篇文章主要介紹了Java應(yīng)用服務(wù)器之tomcat部署,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07