我这里是使用百度的文档对比API,奈何这个API没有Java的示例代码,只能模仿Python的示例代码
f1 = 'E:/aaaLIUTAO/软硬件采购合同副版.pdf' f2 = 'E:/aaaLIUTAO/软硬件采购合同副版.pdf' body = { "baseFile": (os.path.basename(f1), open(f1, 'rb'), "multipart/form-data"), "compareFile": (os.path.basename(f2), open(f2, 'rb'), "multipart/form-data"), }
Python能够直接上传,并且得到的文件名正常显示
但是JAVA得到响应的文件名就是显示????
发现是 MultipartEntityBuilder 的锅
// 不进行文件名的URL编码
System.out.println("baseFile.getName():"+baseFile.getName());
FileBody baseFileBody = new FileBody(baseFile, ContentType.DEFAULT_BINARY, baseFile.getName());
FileBody compareFileBody = new FileBody(compareFile, ContentType.DEFAULT_BINARY, compareFile.getName());
// 创建HttpClient和HttpPost
CloseableHttpClient httpClient = HttpClients.createDefault();
HttpPost httpPost = new HttpPost(requestUrl);
/**
* 后来发现在MultipartEntityBuilder中设置Mode为HttpMultipartMode.RFC6532可以完美解决这个问题,
* 并且不再需要单独设置ContentType或Charset,因为 HttpMultipartMode.RFC6532 就告诉了MultipartEntityBuilder,
* 里面的数据都要使用UTF-8进行处理,fiddler抓到的请求发现filename成功变成中文名。*/
// 设置multipart实体,直接使用原始文件名
HttpEntity entity = MultipartEntityBuilder.create()
.addPart("baseFile", baseFileBody)
.addPart("compareFile", compareFileBody)
.addPart("sealRecognition", new StringBody("false", ContentType.TEXT_PLAIN))
.addPart("handWritingRecognition", new StringBody("false", ContentType.TEXT_PLAIN))
.build();
httpPost.setEntity(entity);
看到博主的文章解决了
使用HttpClient MultipartEntityBuilder 上传文件,并解决中文文件名乱码问题_multipartentitybuilder中文乱码-CSDN博客
/**
* 后来发现在MultipartEntityBuilder中设置Mode为HttpMultipartMode.RFC6532可以完美解决这个问题,
* 并且不再需要单独设置ContentType或Charset,因为 HttpMultipartMode.RFC6532 就告诉了MultipartEntityBuilder,
* 里面的数据都要使用UTF-8进行处理,fiddler抓到的请求发现filename成功变成中文名。*/
// 设置multipart实体,直接使用原始文件名
HttpEntity entity = MultipartEntityBuilder.create()
.setMode(HttpMultipartMode.RFC6532)
.addPart("baseFile", baseFileBody)
.addPart("compareFile", compareFileBody)
.addPart("sealRecognition", new StringBody("false", ContentType.TEXT_PLAIN))
.addPart("handWritingRecognition", new StringBody("false", ContentType.TEXT_PLAIN))
.build();
直接拿下