目錄
- 一、代碼實(shí)現(xiàn)
- 二、MultipartFile工具類
- 三、HttpClient使用
- 四、參考鏈接
一、代碼實(shí)現(xiàn)
1、A服務(wù)接收前端上傳文件并發(fā)送至B服務(wù)
引入依賴
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.13</version>
</dependency>
使用MultipartFile接收前端文件
@PostMapping("/import")
@ApiOperation("文件上傳")
public Object importExcel(@RequestParam("file") MultipartFile file) {
// 后續(xù)文件處理邏輯......
}
調(diào)取第三方接口,發(fā)送 MultipartFile 文件
/**
* 以post方式調(diào)用第三方接口,以form-data 形式 發(fā)送 MultipartFile 文件數(shù)據(jù)
*
* @param url post請求url
* @param fileParamName 文件參數(shù)名稱
* @param multipartFile 文件
* @param paramMap 表單里其他參數(shù)
* @return 響應(yīng)結(jié)果
*/
public static Object doPostFormData(String url, String fileParamName, MultipartFile multipartFile, Map<String, String> paramMap) {
// 創(chuàng)建Http實(shí)例
CloseableHttpClient httpClient = HttpClients.createDefault();
// 創(chuàng)建HttpPost實(shí)例
HttpPost httpPost = new HttpPost(url);
// 請求參數(shù)配置
RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(60000).setConnectTimeout(60000)
.setConnectionRequestTimeout(10000).build();
httpPost.setConfig(requestConfig);
try {
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.setCharset(StandardCharsets.UTF_8);
builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
String fileName = multipartFile.getOriginalFilename();
// 文件流
builder.addBinaryBody(fileParamName, multipartFile.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);
//表單中其他參數(shù)
for (Map.Entry<String, String> entry : paramMap.entrySet()) {
builder.addPart(entry.getKey(), new StringBody(entry.getValue(), ContentType.create("text/plain", Consts.UTF_8)));
}
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
// 執(zhí)行提交
HttpResponse response = httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
// 返回
return EntityUtils.toString(response.getEntity(), StandardCharsets.UTF_8);
}
} catch (Exception e) {
e.printStackTrace();
log.error("調(diào)用HttpPost失??!" + e.toString());
} finally {
if (httpClient != null) {
try {
httpClient.close();
} catch (IOException e) {
log.error("關(guān)閉HttpPost連接失?。?);
}
}
}
return null;
}
2、B服務(wù)接收文件
@PostMapping(value = "/import", headers = "content-type=multipart/form-data")
@ApiOperation("接收上傳文件")
public Result<Object> importExcel(HttpServletRequest request, HttpServletResponse response) {
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver(request.getSession().getServletContext());
commonsMultipartResolver.setDefaultEncoding("utf-8");
if (commonsMultipartResolver.isMultipart(request)){
MultipartHttpServletRequest mulReq = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> map = mulReq.getFileMap();
// fileParamName
MultipartFile multiFile = map.get("fileParamName");
// 后續(xù)文件處理邏輯......
}
return new Result<>().error("請求內(nèi)容有誤!");
}
二、MultipartFile工具類
- 簡介:MultipartFile是SpringMVC提供簡化上傳操作的工具類,在不使用框架之前,都是使用原生的HttpServletRequest來接收上傳的數(shù)據(jù),文件是以二進(jìn)制流傳遞到后端的,然后需要我們自己轉(zhuǎn)換為File類。使用了MultipartFile工具類之后,我們對文件上傳的操作就簡便許多了。
- MultipartFile工具類的接口方法
package org.springframework.web.multipart;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import org.springframework.core.io.InputStreamSource;
import org.springframework.core.io.Resource;
import org.springframework.lang.Nullable;
import org.springframework.util.FileCopyUtils;
public interface MultipartFile extends InputStreamSource {
//getName() 返回參數(shù)的名稱
String getName();
//獲取源文件的昵稱
@Nullable
String getOriginalFilename();
//getContentType() 返回文件的內(nèi)容類型
@Nullable
String getContentType();
//isEmpty() 判斷是否為空,或者上傳的文件是否有內(nèi)容
boolean isEmpty();
//getSize() 返回文件大小 以字節(jié)為單位
long getSize();
//getBytes() 將文件內(nèi)容轉(zhuǎn)化成一個byte[] 返回
byte[] getBytes() throws IOException;
//getInputStream() 返回InputStream讀取文件的內(nèi)容
InputStream getInputStream() throws IOException;
default Resource getResource() {
return new MultipartFileResource(this);
}
//transferTo是復(fù)制file文件到指定位置(比如D盤下的某個位置),不然程序執(zhí)行完,文件就會消失,程序運(yùn)行時,臨時存儲在temp這個文件夾中
void transferTo(File var1) throws IOException, IllegalStateException;
default void transferTo(Path dest) throws IOException, IllegalStateException {
FileCopyUtils.copy(this.getInputStream(), Files.newOutputStream(dest));
}
}
- InputStreamSource 這個接口本質(zhì)上返回的還是一個InputStream 流對象
package org.springframework.core.io;
import java.io.IOException;
import java.io.InputStream;
public interface InputStreamSource {
//定位并打開資源,返回資源對應(yīng)的輸入流。
//每次調(diào)用都會返回新的輸入流,調(diào)用者在使用完畢后必須關(guān)閉該資源。
InputStream getInputStream() throws IOException;
}
三、HttpClient使用
- 使用httpclient,需要下載httpclient-4.5.jar、httpmime-4.5.jar兩個包,下載地址為:http://hc.apache.org/downloads.cgi 大致看了下源碼,其實(shí)也是使用字符拼接,只是封裝后使用起來更簡潔方便一些。、
- httpclient需要注意的4點(diǎn):
- 1.HttpClient4.3版本往后,原來的MultipartEntity過時不建議再使用了,替換成新的httpmime下面的MultipartEntityBuilder
- 2.multipartEntity 最好設(shè)置contentType和boundary,不然會導(dǎo)致后面接收文件時的第一種方法接收不到文件報(bào)錯。
- 3.使用addBinaryBody的坑:addBinaryBody 有6種不同用法,一般都是如下代碼所示上傳File即可,但是當(dāng)傳byte[]字節(jié)數(shù)組時,必須使用4參傳值,且第四參必須帶后綴名,例如:entityBuilder.addBinaryBody(“file”,new byte[]{},ContentType.DEFAULT_BINARY,“fileName.jpg”);否則會導(dǎo)致接收文件時getFileNames()為空。
- 4.不使用addBinaryBody,也可以直接使用addPart,先把文件轉(zhuǎn)換成FileBody就可以了
- contentType使用【multipart/form-data】:它會將表單的數(shù)據(jù)處理為一條消息,以標(biāo)簽為單元,用分隔符分開。既可以上傳鍵值對,也可以上傳文件,
- boundary:請求體中的boundary參數(shù)指定的就是分隔體,請求參數(shù)之間需要通過分隔體分隔,不然就會被識別成一個參數(shù)。
四、參考鏈接
- https://blog.csdn.net/lexuansweet/article/details/122967948
文章來源地址http://www.zghlxwxcb.cn/news/detail-654525.html
文章來源:http://www.zghlxwxcb.cn/news/detail-654525.html
到了這里,關(guān)于【使用multipart/form-data方式傳遞MultipartFile參數(shù),實(shí)現(xiàn)服務(wù)間文件的傳遞】的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!