做的一个上传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