Java中request請求之 - 帶文件上傳的form表單


  常用系統開發中總免不了顯示圖片,保存一些文件資料等操作。

  這些操作的背后,就是程序員最熟悉的 enctype="multipart/form-data"類型的表單。

說起file類型的input,我們往往會遇到問題:

  最為常見的就是編碼格式-中文亂碼。解決中文亂碼最好的方式就是我們的項目全部使用 utf-8 格式的國際編碼,因為它是可變字節長度的編碼,對於占用2字節的中文綽綽有余了。另外就是使用 String s2 = new String(s1.getBytes(“ISO-8859-1”),”GBK”); 將服務器編碼(以tomcat為例)轉換為gbk中文編碼。

  其次就是request接收參數的問題。首先看段代碼

//-----代碼片段 spingMVC上傳文件
MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request;//request強制轉換注意

                    MultipartFile file = mRequest.getFile("file");
                    if (!file.isEmpty()) {
                        String fileName = file.getOriginalFilename();
                        if (StringUtils.isNotBlank(fileName)) {// 因為最后一個添加的控件沒有上傳相應的內容
                            String uuid = UUID.randomUUID().toString();
                            String fileType = fileName.substring(fileName
                                    .lastIndexOf("."));
                            // 使用字符替換圖片名稱,防止亂碼
                            String tempName = uuid.substring(1, 10) + fileType;

                            uploadFilePath = fileRootHelper.getOrigImage()
                                    + tempName;
                            File uploadfile = new File(basepath
                                    + uploadFilePath);// 上傳地址

                            File mir = new File(basepath
                                    + fileRootHelper.getOrigImage());// 文件路徑

                            if (!mir.exists()) {
                                mir.mkdirs();
                            }
                            file.transferTo(uploadfile);// 開始上傳
                        }

執行 MultipartHttpServletRequest mRequest = (MultipartHttpServletRequest) request; 該行代碼時,如果請求中不包含file類型的input,必然會產生異常。

而request請求都是經過spring-mvc配置文件的,在沒有進入請求方法之前,異常已經產生了。由此,問題來了 ??

如何避免異常產生呢?

  一種比較直觀的方法是:

<form action="iconUpload.action" method="post"enctype="multipart/form-data">
  <p>First name: <input type="text" name="fname" /></p>
  <p>Last name: <input type="text" name="lname" /></p>
  <p>Icon <input type="file" name = "ficon"/></p>        
  <input type="submit" value="Submit" />
</form>

  <input type="file" name = "ficon"/> 不選時由后台 file.isEmpty() 判斷,而不是在前端做判斷。

  還有一種做法是前端做判斷傳或是不傳,后端再次判斷有沒有文件流過來,分別寫2種處理方法 。具體代碼就不貼了,且個人沒有找到實現的方式代碼 -_-!

 

個人感悟:

  每個人思維模式不相同,解決問題的思路也會不同。

  但終歸是圍繞 '解決問題' 而展開的,善於學習他人的思維模式,彌補自己的鄙夷。這樣才能快速,高效的解決問題。俗話說:沒有做不到,只有想不到 。

  虛心接納他人意見,理解他人,這樣不僅對自己成長有所幫助,更是個人修養與價值的體現。多思維是每個人人生道路上不可或缺的財富!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM