项目中使用了路由zuul。
用HttpServletRequest接收文件参数
使用 MultipartHttpServletRequest multi = (MultipartHttpServletRequest) httpServletRequest;
file.getOriginalFilename()得到的名称时乱码。
此时在网关项目中添加
zuul:
servlet-path: /
Spring Cloud Zuul对于上传文件有两种处理方式,一种是用spring mvc,另一种是zuulServlet。spring mvc会导致乱码问题,zuulServlet不会。在zuul的过滤器中,有一个pre的过滤器 ServletDetectionFilter,他的执行顺序是-3,也是最先执行的过滤器,在这个过滤器中,有这么一段代码:
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
if (!(request instanceof HttpServletRequestWrapper)
&& isDispatcherServletRequest(request)) {
ctx.set(IS_DISPATCHER_SERVLET_REQUEST_KEY, true);
} else {
ctx.set(IS_DISPATCHER_SERVLET_REQUEST_KEY, false);
}
return null;
}
用来判断使用springmvc 还是zuulServlet,IS_DISPATCHER_SERVLET_REQUEST_KEY为false就会用ZuulServlet处理。如果没加/zuul前缀,IS_DISPATCHER_SERVLET_REQUEST_KEY就会置为true,就会用spring mvc上传。一般情况下,发送到API网关的外部请求都会被Spring的DispatcherServlet处理,除了通过/zuul/路径访问的请求会绕过DispatcherServlet,被ZuulServlet处理。