您的位置:首页 > 理论基础 > 计算机网络

HttpClient中转上传文件,模拟form表单提交MultipartFile文件post到服务器。解决中文乱码问题

2019-05-16 15:51 1796 查看

在很多时候我们一个系统不单单只访问自己系统功能,需要访问别的系统,浏览器通常会报跨域请求问题。就需要先访问本系统,再通过后端调用其他系统接口。
场景:客户端A---->选择文件上传---->服务器B---->模拟form---->服务器C---->返回结果---->服务器B---->客户端A

选择文件上传模拟form返回结果返回结果客户端A服务器B服务器C

最近突然接到这个项目,开始没有设置附件名的编码,总是出现中文乱码的问题。一直弄了很久,网上试了很多办法也没有解决,最后是把附件名作为参数设置Multipart EntityBuilder.addtextbody 的编码形式传参设置解决。
代码如下:
1、导入HttpCLient的jar包,在项目pom.xml设置以下属性

<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.5</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.5</version>
</dependency>

2、主要代码区域

@ApiOperation(value = "上传文件", notes = "上传文件")
@ApiResponses({ @ApiResponse(code = 200, message = "成功") })
@RequestMapping(value = "/upload", method = RequestMethod.POST)
@ResponseBody
public Object upload(HttpServletRequest request,
@RequestParam(value="file",required=false) MultipartFile file) throws BaseAppException, IllegalStateException, IOException {
final String remote_url ="http://172.16.100.199:8089/upload";// 第三方服务器请求地址
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = "";
try {
String fileName = file.getOriginalFilename();
HttpPost httpPost = new HttpPost(remote_url);
MultipartEntityBuilder builder = MultipartEntityBuilder.create();
builder.addBinaryBody("file", file.getInputStream(), ContentType.MULTIPART_FORM_DATA, fileName);// 文件流

//参数设置编码utf-8,不然中文会乱码
ContentType contentType = ContentType.create("text/plain",Charset.forName("UTF-8"));

builder.addTextBody("filename", fileName,contentType);// 类似浏览器表单提交,对应input的name和value
HttpEntity entity = builder.build();
httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost);// 执行提交
HttpEntity responseEntity = response.getEntity();
if (responseEntity != null) {
// 将响应内容转换为字符串
result = EntityUtils.toString(responseEntity, Charset.forName("UTF-8"));
}
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐