1、現(xiàn)象
①從request域中獲取多文件:
List<MultipartFile> files = ((MultipartHttpServletRequest) request).getFiles("file[]");
②獲取單個文件名:
String name = multipartFile.getOriginalFilename(); //此時name=????全是問號,還非亂碼
③無效的解決方法:
String fileName = new String(name.getBytes(),"utf-8"); //什么IOS8859-1什么的都是無用的,或是其他轉UTF-8都是無用的
2、原因
- 先找官網(wǎng)文檔(谷歌翻譯如下)

11111.png
- 詳細原因,找源碼
a)在ServletDetectionFilter過濾中
Spring Cloud Zuul現(xiàn)在對于上傳文件有兩種處理方式,一種是用spring mvc,另一種是zuulServlet。spring mvc對文件處理不是很好,會導致亂碼問題,zuulServlet則不會。
在zuul的過濾器中,有一個pre的過濾器 ServletDetectionFilter,他的執(zhí)行順序是-3,也是最先執(zhí)行的過濾器,在這個過濾器中,有這么一段代碼:

22222.png
在這個方法中,IS_DISPATCHER_SERVLET_REQUEST_KEY為false就會用ZuulServlet處理。如果沒加/zuul前綴,IS_DISPATCHER_SERVLET_REQUEST_KEY就會置為true,就會用spring mvc上傳。
b)再看ServletDetectionFilter過濾器
這個過濾器的用處主要是處理表單數(shù)據(jù),包括多部分表單數(shù)據(jù)(即文件)上傳
源碼:
Implementation of {@link HttpMessageConverter} that can handle form data, including multipart form data (i.e. file uploads).
c)病根就在這里

33333.png
3、解決辦法
看官方文檔 :

55555.png
第一種解決方案,api接口前面 /zuul:
在不修改zuul默認配置參數(shù)的情況下,在上傳文件的請求路徑之前添加字符串“zuul”聲明此請求被ZuulServlet處理。
例如在當前代碼下,請求路徑是:
localhost:8080/up/upload
那么采用方案一解決中文亂碼的請求路徑就是:
localhost:8080/zuul/up/upload
經(jīng)過測試,中文亂碼問題成功解決。
如果第一種方式,顯示404,嘗試第二種解決方案,改zuul的配置文件:
在zuul的配置文件中添加一個如下的屬性:
zuul.servlet-path=/