在做個小項目的過程中需要用到圖片上傳功能,於是使用一個適用於小檔案上傳的commons-fileupload組件。
其響應過程是這樣的:在jsp頁面通過input標籤獲得圖片檔案==>發送到servlet中處理==>servlet中驗證大小、格式等,最後寫入硬碟與路徑儲存到資料庫==>控制頁面跳轉。
servlet處的處理代碼我就不多提了,和各大網站上大家的處理方式差不多,無非就是遵循以下幾個步驟:
1、在doPost方法中通過request請求對象擷取含有二進位流的表單內容;
2、通過工廠DiskFileItemFactory來構建上傳對象ServletFileUpload;
3、開始自己需要的業務驗證(我這裡驗證了檔案大小、是否直接路徑訪問、檔案是否為空白檔案、是否超出規定的格式);
4、寫入硬碟/資料庫記錄
前端JSP頁面的關鍵代碼如下:
<form action="test" method="post" enctype="multipart/form-data"><%session.setAttribute("uid", "test");%><input type="text" name="user_id" value="test" /><br /> <input type="text" name="user_sex" value="1" /><br /> <input type="text" name="letter_anonymous" value="1" /><br /> <input type="file" accept="image/*"/><br /> <input type="submit" value="ok" /><br /></form>
不知道大家有沒有從這段代碼裡面發現問題了。
測試的過程中發現這個二進位表單中的文本域是可以擷取到的,但是檔案域的內容卻一直顯示為空白。
並不是說我沒有選擇檔案。
後來糾結了好久都沒發現問題在哪,對比一下別人的代碼發現別人的檔案標籤中加多了一個name屬性(如果想要檔案能上傳的話,就必須定義這個name屬性)。
解決方案就是在<input type="file" / >標籤中定義它的name屬性,變成:
<input type="file" name="1" accept="image/*" />
原理我還搞不懂,要查查。