-
使用httpclient调用文件上传接口,做上传文件的操作,直接上代码:
- 第一个参数是请求路径,第二个参数是文件本地路径
public static String uploadFile(String url, String filePath) throws Exception {
CloseableHttpClient client = HttpClients.createDefault();
HttpResponse response = null;
String result= "";
if (StringUtils.isNotBlank(url)) {
HttpPost post = new HttpPost(url);
post.setHeader("params", "111");
File file = new File(filePath);
FileInputStream fileInputStream = new FileInputStream(file);
HttpEntity build = MultipartEntityBuilder.create()
.addBinaryBody("file", fileInputStream, ContentType.DEFAULT_BINARY, file.getName()).build();
post.setEntity(build);
// 执行post请求
response = client.execute(post);
// 获取响应码
int statusCode = response.getStatusLine().getStatusCode();
// 通过EntityUitls获取返回内容
String string = EntityUtils.toString(response.getEntity(), "UTF-8");
if (200 == statusCode) {
result= string;
}
client.close();
}
return result;
} else {
return result;
}
}
上传一个中文名的文件:redis常用命令.txt ,接口的返还值会返还文件名
接口的返还值出现乱码:"fileName":"redis????.txt"
解决方案:
将:
HttpEntity build = MultipartEntityBuilder.create().addBinaryBody("file", fileInputStream, ContentType.DEFAULT_BINARY, file.getName()).build();
改为:
MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.RFC6532);
HttpEntity build = multipartEntityBuilder.addBinaryBody("file", fileInputStream,ContentType.DEFAULT_BINARY,file.getName()).build();
各种试,试了将MultipartEntityBuilder设置Charset或者是手动设置ContentType,都无法解决此问题,文件名依然是上图所示乱码后来发现在MultipartEntityBuilder中设置Mode为HttpMultipartMode.RFC6532可以完美解决这个问题,并且不再需要单独设置ContentType或Charset,因为HttpMultipartMode.RFC6532就告诉了MultipartEntityBuilder,里面的数据都要使用UTF-8进行处理.