关于HttpClient上传文件附件时,文件名中的中文会变为乱码

前段时间在开发一套对接第三方系统的接口时,涉及到一个附件传输的接口。接口主要使用HttpClient发送请求,请求体中包含附件对象,Content-Type为multipart/form-data格式。在本地环境测试时一切正常,上到测试环境后事情开始变得诡异起来。。。
原本的附件在通过postman工具上传到系统的附件接口后,到达测试环境的文件名称突然变成了乱码。例如 ”测试pdf.pdf“变成了"??pdf.pdf"。包含中文的部分全部变成了乱码。
因此第一时间想到的是文件复制以及文件名称转码操作,由于不确定测试环境所包含的文件名到底是何种类型进行的编码,这里选择通过遍历jdk提供的编码集合打印出对应解码的结果。

    public String getCharsetEncoding(String attachmentName){
        StringBuilder sb = new StringBuilder("字符编码检查工具");
        for (String s : Charset.availableCharsets().keySet()) {
            String convert = null;
            try {
                convert = new String(attachmentName.getBytes(s), StandardCharsets.UTF_8);
                sb.append(s).append(" to convert = ").append(convert).append("  ;");
                System.out.println(s+"to convert = "+convert);
            } catch (Exception e) {
                System.out.println(s+"编码不兼容");
            }
        }
        return sb.toString();
    }

将这段代码上传到测试环境开始测试**(切记此类代码必须删除)**

通过打印出来的日志可以发现,以上的方法无法找到正确的编码格式,打印出来的还是一坨乱码,即使遍历了Charset.availbleCharsets()中的所有字符编码集进行解码再编码,都无法获取到正确的中文字符解码结果。由此可判断,问题并不是出在解码这一段。乱码的本质是字符串编码与解码方式的不匹配,因此问题可能是由于字符串编码格式的问题,因此我们这边又尝试了通过httpClient自行设置编码格式进行文件传输,在上传文件前对文件名称先进行一次转码。
经过测试,文件名称依然是乱码,证明此乱码发生过程可能不在我们业务代码控制范围中,控制变量后发现只有Multipart/form-data格式下会出现这种问题。大致可以确定问题所在,具体产生这个问题的原因后续还需要继续排查。
先说一下对应的解决方式:由于文件名称乱码,因此我们决定采用新加参数传输文件名称的方式,文件名称通过URLEncode等方式进行加密一次之后,再对文件进行更名处理。处理完成后即可正常展示文件名称。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值