上传文件中文乱码问题修复

做的一个上传excel功能,在本地环境测试没有问题,部署到开发和测试环境,生成的文件,获取文件名就会发现中文乱码

puma obs service prepared to uploadByInputStream file name = ?????????.xls

遇到中文乱码 我们自然想到用new String(fileName.getBytes("IOS-8859-1"),"utf-8"),这种方式去转码,然后前面说了,本地环境没有问题,那可以肯定不是代码的问题。

思考一下,本地和开发、测试环境的差异:本地是localhost请求,而另外两个环境走了网关,那可能是网关出了问题。

要验证这个问题,可以本地把网关服务和eureka服务起起来验证,这里不赘述了

最后发现这个问题是因为网关上的zuul服务版本较低所致,但是又不能轻易升级zuul的版本,万一影响其他业务得不偿失,可以考虑重写 ServletDetectionFilter

我们在网关层来解决这个问题

@Component
public class ServletDetectionFilterFile extends ServletDetectionFilter {

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        if (!(request instanceof HttpServletRequestWrapper)
                && this.isDispatcherServletRequest(request)
                && !this.isMultipartContent(request)) {
            ctx.set("isDispatcherServletRequest", true);
        } else {
            ctx.set("isDispatcherServletRequest", false);
        }

        return null;
    }

    private boolean isDispatcherServletRequest(HttpServletRequest request) {
        return request.getAttribute(DispatcherServlet.WEB_APPLICATION_CONTEXT_ATTRIBUTE) != null;
    }

    /**
     * 判断是否是multipart/form-data请求
     *
     * @param request 请求
     * @return 是否是
     */
    private boolean isMultipartContent(HttpServletRequest request) {
        String requesType = "post";
        if (!requesType.equals(request.getMethod().toLowerCase())) {
            return false;
        }
        //获取Content-Type
        String contentType = request.getContentType();
        return (contentType != null) && (contentType.toLowerCase().startsWith("multipart/"));
    }

}

&& !this.isMultipartContent(request)  加了一个自己的业务判断,如果是表单提交过来的post请求,并且是上传文件,走自己的zuul

还需要在application.yml添加配置

zuul:
  servletPath:

否则会报404

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值