1. 程式人生 > >SpringMVC用MultipartFile上傳檔案及檔名中文亂碼

SpringMVC用MultipartFile上傳檔案及檔名中文亂碼

前言

近日,專案中有個需求-android端上傳一個商品多張圖片,需要java後臺。以前後臺使用了struts,現在是springmvc。想著很多東西是不是能優化一下,正好重新寫一下。

android端有時間再記錄一下
後臺環境是win10+jdk1.8 + tomcat8.0.25 + idea14.0.1
軟體:springmvc+ hibernate+spring +mysql (maven構建)

過程

  1. pring mvc的檔案上傳是通過commons-fileupload來完成的,首先我們需要新增maven依賴:
<!--fileupload-->
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.3</version> </dependency> <dependency> <groupId>commons-io</groupId
>
<artifactId>commons-io</artifactId> <version>2.2</version> </dependency>

這裡又得記錄一個小坑,今天在maven倉庫手動下載了這兩個包,匯入倉庫,但是在idea中update倉庫之後,啟動程式還是報錯找不到FactoryItemXXX類,這個是commons-fileupload的類。但是明明就已經有了。實在不行了,就將倉庫中的刪了。然後讓maven自己去下載,但是修改完pom檔案卻遲遲不見下載,後來發現,這個檔案由於modules的module配置值出錯,將此註釋,即刻下載。
2. mvc的配置檔案中新增MultipartResolver的申明
spring mvc預設的解析器沒有加入對檔案上傳的解析,我們要在mvc的配置檔案中新增MultipartResolver的申明,因為CommonsMultipartResolver實現了MultipartResolver介面,所以配置如下:

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
            p:defaultEncoding="UTF-8"
            p:maxUploadSize="5400000"
            p:uploadTempDir="fileUpload/temp"  ></bean>
  1. form表單
<form action="user/fileUpload" method="post" enctype="multipart/form-data">  
    <input type="file" name="files" />  
    <input type="submit" value="上傳" />  
</form>

  1. 書寫後臺controller類

需要注意的是window下路徑的斜槓需要轉義

@RequestMapping("fileUpload")
    public String fileUpload(@RequestParam("file") MultipartFile file) {
        if (!file.isEmpty()) {
            String filePath = request.getSession().getServletContext().getRealPath("/") + "\\fileUpload\\" +  file.getOriginalFilename();//感覺是不是對檔名裁剪空格後儲存比較好?
            //轉存檔案
            try {
                file.transferTo(new File(filePath));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // 重定向
        return "redirect:/jsp/succ.jsp";
    }

親重新整理試試


  1. 上傳的檔案中文名亂碼

當然有可能你的檔案上傳後,檔名中文亂碼
出現這種情況,首先需要檢查
xml
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"
p:defaultEncoding="UTF-8"
p:maxUploadSize="5400000"
p:uploadTempDir="fileUpload/temp" ></bean>

裡面是不是配置了utf-8,因為預設是iso編碼(這種情況request.getCharacterEncoding獲得值是null,其實就是ISO編碼)。
其次需要就檢查檔案上傳的那個jsp頁面編碼裡面的編碼。包括pageCode,charset和head標籤中meta編碼最好都是utf-8編碼。其他的想tomcat的 server.xml和專案的web.xml都是可以直接使用預設(有網友指出這兩個地方需要修改,親測這兩個我都沒改,只是保證了CommonsMultipartResolver和jsp頁面編碼就ok了)。

參考

最後一篇參考資料提到的jar包問題和編碼要保證四個地方的配置正確都是有問題的,但是有點參考價值