在很多时候我们一个系统不单单只访问自己系统功能,需要访问别的系统,浏览器通常会报跨域请求问题。就需要先访问本系统,再通过后端调用其他系统接口。
场景:客户端A---->选择文件上传---->服务器B---->模拟form---->服务器C---->返回结果---->服务器B---->客户端A
最近突然接到这个项目,开始没有设置附件名的编码,总是出现中文乱码的问题。一直弄了很久,网上试了很多办法也没有解决,最后是把附件名作为参数设置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;
}