spring cloud zuul上傳文件中文名錯誤

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=/
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容