天天看點

servletFileUpload

<code>    </code><code>public</code> <code>void</code> <code>doPost(HttpServletRequest request, HttpServletResponse response)</code>

<code>            </code><code>throws</code> <code>ServletException, IOException {</code>

<code>        </code><code>request.setCharacterEncoding(</code><code>"utf-8"</code><code>);</code>

<code>        </code><code>final</code> <code>long</code> <code>MAX_SIZE = </code><code>300</code> <code>* </code><code>1024</code> <code>* </code><code>1024</code><code>;</code><code>// 設定上傳檔案最大值</code>

<code>        </code><code>//允許上傳檔案格式的清單</code>

<code>        </code><code>final</code> <code>String[] allowedExt = </code><code>new</code> <code>String[]{</code><code>"jpg"</code><code>, </code><code>"jpeg"</code><code>, </code><code>"gif"</code><code>, </code><code>"txt"</code><code>, </code><code>"doc"</code><code>, </code><code>"mp3"</code><code>, </code><code>"wma"</code><code>, </code><code>"m4a"</code><code>, </code><code>"rar"</code><code>, </code><code>"zip"</code><code>};</code>

<code>        </code><code>response.setContentType(</code><code>"text/html"</code><code>);</code>

<code>        </code><code>// 設定字元編碼為UTF-8, 統一編碼,處理出現亂碼問題</code>

<code>        </code><code>response.setCharacterEncoding(</code><code>"UTF-8"</code><code>);</code>

<code>        </code><code>// 執行個體化一個硬碟檔案工廠,用來配置上傳元件ServletFileUpload</code>

<code>        </code><code>DiskFileItemFactory dfif = </code><code>new</code> <code>DiskFileItemFactory();</code>

<code>        </code><code>dfif.setSizeThreshold(</code><code>4096</code><code>);</code><code>// 設定上傳檔案時用于臨時存放檔案的記憶體大小,這裡是4K.多于的部分将臨時存在硬碟</code>

<code>        </code><code>dfif.setRepository(</code><code>new</code> <code>File(request.getRealPath(</code><code>"/"</code><code>)+</code><code>"ImagesUploadTemp"</code><code>));</code>

<code>        </code><code>// 用以上工廠執行個體化上傳元件</code>

<code>        </code><code>ServletFileUpload sfu = </code><code>new</code> <code>ServletFileUpload(dfif);</code>

<code>        </code><code>//設定最大上傳大小</code>

<code>        </code><code>sfu.setSizeMax(MAX_SIZE);</code>

<code>        </code><code>PrintWriter out = response.getWriter();</code>

<code>        </code><code>//從request得到所有上傳域的清單</code>

<code>        </code><code>List fileList = </code><code>null</code><code>;</code>

<code>        </code><code>try</code><code>{</code>

<code>            </code><code>fileList = sfu.parseRequest(request);</code>

<code>        </code><code>}</code><code>catch</code><code>(FileUploadException e){</code>

<code>            </code><code>// 處理檔案尺寸過大異常</code>

<code>            </code><code>if</code><code>(e </code><code>instanceof</code> <code>SizeLimitExceededException){</code>

<code>                </code><code>out.println(</code><code>"檔案尺寸超過規定大小:"</code> <code>+ MAX_SIZE + </code><code>"位元組&lt;p/&gt;"</code><code>);</code>

<code>                </code><code>out.println(</code><code>"&lt;a href=\"#\" &gt;傳回&lt;/a&gt;"</code><code>);</code>

<code>                </code><code>return</code><code>;</code>

<code>            </code><code>}</code>

<code>            </code><code>e.printStackTrace();</code>

<code>        </code><code>}</code>

<code>        </code><code>//沒有檔案上傳</code>

<code>        </code><code>if</code><code>(fileList == </code><code>null</code> <code>|| fileList.size() == </code><code>0</code><code>){</code>

<code>            </code><code>out.println(</code><code>"請選擇上傳檔案&lt;p/&gt;"</code><code>);</code>

<code>            </code><code>out.println(</code><code>"&lt;a href=\"#\" &gt;傳回&lt;/a&gt;"</code><code>);</code>

<code>            </code><code>return</code><code>;</code>

<code>        </code><code>//得到所有上傳的檔案</code>

<code>        </code><code>Iterator fileItr = fileList.iterator();</code>

<code>        </code><code>//循環處理所有檔案</code>

<code>        </code><code>while</code><code>(fileItr.hasNext()){</code>

<code>            </code><code>FileItem fileItem  = </code><code>null</code><code>;</code>

<code>            </code><code>String path = </code><code>null</code><code>;</code>

<code>            </code><code>long</code> <code>size = </code><code>0</code><code>;</code>

<code>            </code><code>//得到目前檔案</code>

<code>            </code><code>fileItem = (FileItem) fileItr.next();</code>

<code>            </code><code>// 忽略簡單form字段而不是上傳域的檔案域(&lt;input type="text" /&gt;等)</code>

<code>            </code><code>if</code> <code>(fileItem == </code><code>null</code> <code>|| fileItem.isFormField())</code>

<code>            </code><code>{</code>

<code>                </code><code>continue</code><code>;</code>

<code>            </code><code>// 得到檔案的完整路徑</code>

<code>            </code><code>path = fileItem.getName();</code>

<code>            </code><code>// 得到檔案的大小</code>

<code>            </code><code>size = fileItem.getSize();</code>

<code>            </code><code>if</code> <code>(</code><code>""</code><code>.equals(path) || size == </code><code>0</code><code>)</code>

<code>                </code><code>out.println(</code><code>"請選擇上傳檔案&lt;p /&gt;"</code><code>);</code>

<code>         </code><code>// 得到去除路徑的檔案名</code>

<code>            </code><code>String t_name = path.substring(path.lastIndexOf(</code><code>"//"</code><code>) + </code><code>1</code><code>);</code>

<code>            </code><code>// 得到檔案的擴充名(無擴充名時将得到全名)</code>

<code>            </code><code>String t_ext = t_name.substring(t_name.lastIndexOf(</code><code>"."</code><code>) + </code><code>1</code><code>);</code>

<code>            </code><code>// 拒絕接受規定檔案格式之外的檔案類型</code>

<code>            </code><code>int</code> <code>allowFlag = </code><code>0</code><code>;</code>

<code>            </code><code>int</code> <code>allowedExtCount = allowedExt.length;</code>

<code>            </code><code>for</code> <code>(; allowFlag &lt; allowedExtCount; allowFlag++)</code>

<code>                </code><code>if</code> <code>(allowedExt[allowFlag].equals(t_ext))</code>

<code>                    </code><code>break</code><code>;</code>

<code>            </code><code>if</code> <code>(allowFlag == allowedExtCount)</code>

<code>                </code><code>out.println(</code><code>"請上傳以下類型的檔案&lt;p /&gt;"</code><code>);</code>

<code>                </code><code>for</code> <code>(allowFlag = </code><code>0</code><code>; allowFlag &lt; allowedExtCount; allowFlag++)</code>

<code>                    </code><code>out.println(</code><code>"*."</code> <code>+ allowedExt[allowFlag] + </code><code>"   "</code><code>);</code>

<code>                </code><code>out.println(</code><code>"&lt;p /&gt;&lt;a href=\"#\" &gt;傳回&lt;/a&gt;"</code><code>);</code>

<code>            </code><code>//long now = System.currentTimeMillis();</code>

<code>            </code><code>// 根據系統時間生成上傳後儲存的檔案名</code>

<code>            </code><code>//String prefix = String.valueOf(now);</code>

<code>            </code><code>// 儲存的最終檔案完整路徑,儲存在web根目錄下的ImagesUploaded目錄下</code>

<code>            </code><code>// String u_name = request.getRealPath("/") + "ImagesUploaded/"</code>

<code>            </code><code>// + prefix + "." + t_ext;</code>

<code>            </code><code>String filename = t_name;</code>

<code>            </code><code>System.out.println(t_name);</code>

<code>            </code><code>try</code>

<code>                </code><code>// 儲存檔案到C://upload目錄下</code>

<code>                </code><code>fileItem.write(</code><code>new</code> <code>File(</code><code>"C://upload//"</code> <code>+ filename));</code>

<code>                </code><code>//System.out.println(filename);</code>

<code>                </code><code>out.println(</code><code>"檔案上傳成功. 已儲存為: "</code> <code>+ filename + </code><code>"   檔案大小: "</code> <code>+ size + </code><code>"位元組&lt;p /&gt;"</code><code>);</code>

<code>                </code><code>out.println(</code><code>"&lt;a href=\"#\" &gt;繼續上傳&lt;/a&gt;"</code><code>);</code>

<code>            </code><code>} </code><code>catch</code> <code>(Exception e)</code>

<code>                </code><code>e.printStackTrace();</code>

<code>    </code><code>}</code>

繼續閱讀