日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在Servlet中使用开源fileupload包实现文件上传功能

發布時間:2025/7/14 编程问答 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Servlet中使用开源fileupload包实现文件上传功能 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


當我們在 HTML 表單中選擇本地文件之后點擊“提交”按鈕則會將文件上傳到服務器中,此時該 HTTP 請求正文的數據類型就是 multipart/form-data 型的。而在 Servlet 技術中,該 HTTP 請求會被 Servlet 容器(如 Tomcat)包裝成 HttpServletRequest 對象,再由端所請求的相應 Servlet 進行處理。

但是,如果此時我們在服務器端編寫的 Servlet 一點點地解析這個 HTTP 請求,分離出其中的文本表單和上傳的文件類型,這未免有點低效。于是,我們可以使用 Apache 開源上傳軟件包 fileupload 來簡化這一過程,直接使用即可。下載地址:http://commons.apache.org/fileupload/

在 fileupload 包中, HTTP 請求中的復雜表單元素都被看做一個 FileItem 對象;FileItem 對象必須由 ServletFileUpload 類中的 parseRequest() 方法解析 HTTP 請求(即被包裝之后的 HttpServletRequest 對象)出來,即分離出具體的文本表單和上傳文件;而 ServletFileUpload 對象的創建需要依賴于 FileItemFactory 工廠將獲得的上傳文件 FileItem 對象保存至服務器硬盤,即 DiskFileItem 對象。

呼…把這個 fileupload 包中的關系講得那么亂,最好還是自己看下載下來的幫助文檔。不過,推薦一個免費的 Java 反編譯器 JD-GUI ,用它能夠很輕松地打開 .jar 文件,除了源代碼中的注釋,其他的一覽無遺,很好用啊。下載地址:http://java.decompiler.free.fr/?q=jdgui

好吧,我們的程序要求:

1、提供一個 HTML 文件,用戶可在相應表單中選擇需要上傳的文件;

2、編寫一個名叫 UploadServlet 的Servlet 文件,主要功能是解析上面 HTML 表單所提交的 HTTP 請求,把普通的文本域和文件域分離開來;

3、UploadServlet 根據 web.xml 配置文件中的初始化參數確定好需要在 Web 服務器存放該文件的目錄,將上傳的文件寫入到該存放目錄中,在我的這里我把上傳的文件保存到 F:\java\JavaWeb\ch05\uploadFile 目錄中,而 F:\java\JavaWeb\ch05\temp 目錄則用作該 Web 應用的臨時目錄。

程序代碼:

upload.html 文件

  • <html>

  • <head><title>Servlet 上傳文件</title></head>

  • <body>

  • <formname="uploadForm"method="POST"

  • enctype="MULTIPART/FORM-DATA"

  • action="upload">

  • ? ? ? ?User Name:<inputtype="text"name="username"size="30"/>

  • ? ? ? ?Upload File1:<inputtype="file"name="file1"size="30"/>

  • ? ? ? ?Upload File2:<inputtype="file"name="file2"size="30"/>

  • <inputtype="submit"name="submit"value="上傳">

  • <inputtype="reset"name="reset"value="重置">

  • </form>

  • </body>

  • </html>

  • UploadServlet.java 文件

  • import javax.servlet.*; ?

  • import javax.servlet.http.*; ?

  • import java.io.*; ?

  • import java.util.*; ?

  • import org.apache.commons.fileupload.*; ?

  • import org.apache.commons.fileupload.servlet.*; ?

  • import org.apache.commons.fileupload.disk.*; ?

  • // Servlet 文件上傳

  • publicclass UploadServlet extends HttpServlet ?

  • { ?

  • private String filePath; ? ?// 文件存放目錄

  • private String tempPath; ? ?// 臨時文件目錄

  • // 初始化

  • publicvoid init(ServletConfig config) throws ServletException ?

  • ? ?{ ?

  • super.init(config); ?

  • // 從配置文件中獲得初始化參數

  • ? ? ? ?filePath = config.getInitParameter("filepath"); ?

  • ? ? ? ?tempPath = config.getInitParameter("temppath"); ?

  • ? ? ? ?ServletContext context = getServletContext(); ?

  • ? ? ? ?filePath = context.getRealPath(filePath); ?

  • ? ? ? ?tempPath = context.getRealPath(tempPath); ?

  • ? ? ? ?System.out.println("文件存放目錄、臨時文件目錄準備完畢 ..."); ?

  • ? ?} ?

  • // doPost

  • publicvoid doPost(HttpServletRequest req, HttpServletResponse res) ?

  • throws IOException, ServletException ?

  • ? ?{ ?

  • ? ? ? ?res.setContentType("text/plain;charset=gbk"); ?

  • ? ? ? ?PrintWriter pw = res.getWriter(); ?

  • try{ ?

  • ? ? ? ? ? ?DiskFileItemFactory diskFactory = newDiskFileItemFactory(); ?

  • // threshold 極限、臨界值,即硬盤緩存 1M

  • ? ? ? ? ? ?diskFactory.setSizeThreshold(4 * 1024); ?

  • // repository 貯藏室,即臨時文件目錄

  • ? ? ? ? ? ?diskFactory.setRepository(new File(tempPath)); ?

  • ? ? ? ? ? ?ServletFileUpload upload = new ServletFileUpload(diskFactory);

  • // 設置允許上傳的最大文件大小 4M

  • ? ? ? ? ? ?upload.setSizeMax(4 * 1024 * 1024); ?

  • // 解析HTTP請求消息頭

  • ? ? ? ? ? ?List fileItems = upload.parseRequest(req); ?

  • ? ? ? ? ? ?Iterator iter = fileItems.iterator(); ?

  • while(iter.hasNext()) ?

  • ? ? ? ? ? ?{ ?

  • ? ? ? ? ? ? ? ?FileItem item = (FileItem)iter.next(); ?

  • if(item.isFormField()) ?

  • ? ? ? ? ? ? ? ?{ ?

  • ? ? ? ? ? ? ? ? ? ?System.out.println("處理表單內容 ..."); ?

  • ? ? ? ? ? ? ? ? ? ?processFormField(item, pw); ?

  • ? ? ? ? ? ? ? ?}else{ ?

  • ? ? ? ? ? ? ? ? ? ?System.out.println("處理上傳的文件 ..."); ?

  • ? ? ? ? ? ? ? ? ? ?processUploadFile(item, pw); ?

  • ? ? ? ? ? ? ? ?} ?

  • ? ? ? ? ? ?}// end while()

  • ? ? ? ? ? ?pw.close(); ?

  • ? ? ? ?}catch(Exception e){ ?

  • ? ? ? ? ? ?System.out.println("使用 fileupload 包時發生異常 ..."); ?

  • ? ? ? ? ? ?e.printStackTrace(); ?

  • ? ? ? ?}// end try ... catch ...

  • ? ?}// end doPost()

  • // 處理表單內容

  • privatevoid processFormField(FileItem item, PrintWriter pw) ?

  • throws Exception ?

  • ? ?{ ?

  • ? ? ? ?String name = item.getFieldName(); ?

  • ? ? ? ?String value = item.getString(); ? ? ? ? ?

  • ? ? ? ?pw.println(name + " : " + value + "\r\n"); ?

  • ? ?} ?

  • // 處理上傳的文件

  • privatevoid processUploadFile(FileItem item, PrintWriter pw) ?

  • throws Exception ?

  • ? ?{ ?

  • // 此時的文件名包含了完整的路徑,得注意加工一下

  • ? ? ? ?String filename = item.getName(); ? ? ? ?

  • ? ? ? ?System.out.println("完整的文件名:" + filename); ?

  • int index = filename.lastIndexOf("\\"); ?

  • ? ? ? ?filename = filename.substring(index + 1, filename.length()); ?

  • long fileSize = item.getSize(); ?

  • if("".equals(filename) && fileSize == 0) ?

  • ? ? ? ?{ ? ? ? ? ? ?

  • ? ? ? ? ? ?System.out.println("文件名為空 ..."); ?

  • return; ?

  • ? ? ? ?} ?

  • ? ? ? ?File uploadFile = new File(filePath + "/" + filename); ?

  • item.write(uploadFile);

  • ? ? ? ?pw.println(filename + " 文件保存完畢 ..."); ?

  • ? ? ? ?pw.println("文件大小為 :" + fileSize + "\r\n"); ?

  • ? ?} ?

  • // doGet

  • publicvoid doGet(HttpServletRequest req, HttpServletResponse res) ?

  • throws IOException, ServletException ?

  • ? ?{ ?

  • ? ? ? ?doPost(req, res); ?

  • ? ?} ?

  • }

  • web.xml 文件

  • <?xmlversion="1.0"encoding="gb2312"?>

  • <web-appxmlns="http://java.sun.com/xml/ns/j2ee"

  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  • xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"

  • version="2.4">

  • <servlet>

  • <servlet-name>UploadServlet</servlet-name>

  • <servlet-class>UploadServlet</servlet-class>

  • <init-param>

  • <param-name>filepath</param-name>

  • <param-value>uploadFile</param-value>

  • </init-param>

  • <init-param>

  • <param-name>temppath</param-name>

  • <param-value>temp</param-value>

  • </init-param>

  • </servlet>

  • <servlet-mapping>

  • <servlet-name>UploadServlet</servlet-name>

  • <url-pattern>/upload</url-pattern>

  • </servlet-mapping>

  • </web-app>

  • 程序運行過程截圖:(在 web.xml 文件中我們把UploadServlet 映射為 upload

    1、啟動 Tomcat ,在瀏覽器輸入 URL 并填寫 HTML 表單,如下:

    2、點擊“上傳”,發出一個包含了上傳文件的復雜 HTTP 請求,由 UploadServlet 進行處理:

    先看下 Tomcat 的控制臺輸出信息:

    再看一下瀏覽器的相應輸出:

    最后看上傳的文件是否被被保存在指定的目錄中:

    嗯,文件目錄和文件保存時間都正確,就是文件大小忘了轉化一下…(*^__^*) …

    小結:

    1、使用開源的 fileupload 包為我們在 UploadServlet 代碼中顯式地用繁雜的 request.getParameter(“username”) 語句來獲取 HTTP 請求所包含的表單值;

    2、而且還省去了我們在 UploadServlet 中自己編寫判斷表單是否是文件或文本類型的代碼;

    3、更重要的是,FileItem 對象的響應方法可以使得我們輕松地獲取文件名、文件大小、路徑等等;

    4、最重要的是,使用 JD-GUI 反編譯器簡單地看看開源的 fileupload 包中的類組織結構,這更加有意思、有用


    轉載于:https://blog.51cto.com/laokaddk/1340699

    《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

    總結

    以上是生活随笔為你收集整理的在Servlet中使用开源fileupload包实现文件上传功能的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。