常用系統開發中總免不了顯示圖片,保存一些文件資料等操作。
這些操作的背后,就是程序員最熟悉的 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種處理方法 。具體代碼就不貼了,且個人沒有找到實現的方式代碼 -_-!
個人感悟:
每個人思維模式不相同,解決問題的思路也會不同。
但終歸是圍繞 '解決問題' 而展開的,善於學習他人的思維模式,彌補自己的鄙夷。這樣才能快速,高效的解決問題。俗話說:沒有做不到,只有想不到 。
虛心接納他人意見,理解他人,這樣不僅對自己成長有所幫助,更是個人修養與價值的體現。多思維是每個人人生道路上不可或缺的財富!!