Httpclient3.x使用FileParts上传附件中文附件名乱码问题解决

(36) 2023-09-27 18:12

Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说Httpclient3.x使用FileParts上传附件中文附件名乱码问题解决,希望能够帮助你!!!。

前言:

最近项目上有一个需求,使用httpclient模拟表单附件上传功能,并携字符串带参数,在上传附件时服务端接收到的附件名称总是乱码,纠结许久,最终看了httpclient源码发现是3.x版本有bug导致

问题发现:

查看FilePart源码,发现代码中强制将文件名称转成了ASCI格式:

Httpclient3.x使用FileParts上传附件中文附件名乱码问题解决_https://bianchenghao6.com/blog__第1张

出问题的源码截图

问题处理:

出现如上情况,只能通过重写源码的方式处理,下面为我重写后的源代码

Httpclient3.x使用FileParts上传附件中文附件名乱码问题解决_https://bianchenghao6.com/blog__第2张

在调用的地方之间创建重写的这个对象即可,文件上传代码示例如下所示:

public void upload(String localFile,String descUrl,String token,List<AffixInfo> affixInfos){
 File file = new File(localFile);
 PostMethod filePost = new PostMethod(descUrl);
 HttpClient client = new HttpClient();
 //filePost.addRequestHeader("Content-Type", "application/x-www-form-urlencoded");//设置请求头
 try {
 // 通过以下方法可以模拟页面参数提交
 StringPart sp = new StringPart("token",URLEncoder.encode(token, "utf-8") );
 FilePartExt filePart = new FilePartExt("fileupload", file);//使用自己重写的类
 //FilePart filePart = new FilePart(name, file);
 Part[] parts = {sp,filePart}; 
 //filePost.getParams().setContentCharset("UTF-8");
 filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
 client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
 
 int status = client.executeMethod(filePost);
 
 if (status == HttpStatus.SC_OK) {
 System.out.println("上传成功");
 String result = filePost.getResponseBodyAsString();
 
 if(StringUtils.isNotEmpty(result)){
 JSONObject resultObject = JSONObject.parseObject(result);
 String statusRult = resultObject.get("status").toString();
 if(StringUtils.equals("1", statusRult)){
 String attachName = resultObject.get("attachName").toString();
 String fileTime = resultObject.get("fileTime").toString();
 String name = resultObject.get("name").toString();
 String path = resultObject.get("path").toString();
 String size = resultObject.get("size").toString();
 String msg = resultObject.get("msg").toString();
 AffixInfo affixInfo = new AffixInfo(name, path, size, fileTime);
 affixInfos.add(affixInfo);
 }
 }
 } else {
 System.out.println("上传失败");
 }
 } catch (Exception ex) {
 ex.printStackTrace();
 } finally {
 filePost.releaseConnection();
 }
 }

今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

上一篇

已是最后文章

下一篇

已是最新文章

发表回复