Servlet 實現文件上傳

編程語言 Tomcat Java HTML 小龍視頻秀 2017-06-23

Servlet 實現文件上傳

所謂文件上傳就是將本地的文件發送到服務器中保存。例如我們向百度網盤中上傳本地的資源或者我們將寫好的博客上傳到服務器等等就是典型的文件上傳。

Servlet 3.0

上次完成文件下載功能使用的是 Servlet 2.5,但是想要完成文件上傳,那麼繼續使用 Servlet 2.5 肯定不是一個好的選擇,因此我們使用 Servlet 3.0 來完成文件上傳。下面我來簡單介紹一下 Servlet 3.0 的新特性:

  1. 新增的註解支持

    該版本新增了若干註解,用於簡化 Servlet、過濾器(Filter)和監聽器(Listener)的聲明,這使得 web.xml 部署描述文件從該版本開始不再是必選的了。

  2. HttpServletRequest 對文件上傳的支持

    此前,對於處理上傳文件的操作一直是讓開發者頭疼的問題,因為 Servlet 本身沒有對此提供直接的支持,需要使用第三方框架來實現,而且使用起來也不夠簡單。如今這都成為了歷史,Servlet 3.0 已經提供了這個功能,而且使用也非常簡單。

Servlet 3.0 的新特性當然肯定不止這些,但是其他的新特性在這裡我們暫時還用不到,也就不做過多瞭解了。

必要條件

想要完成文件上傳,肯定不是這麼簡單,它對瀏覽器端和服務器端都有許多的要求。

對瀏覽器的要求:

  1. 一個文件的大小一般肯定不止 1 KB,既然這樣,那麼要上傳一個文件肯定不能使用 get 方式了,所以上傳文件時必須採用 post 方式。

  2. 2.表單中必須有一個文件上傳項 <input type="file">,而且必須有 name 屬性。

  3. 必須設置表單的 enctype 屬性值為 multipart/form-data

對服務器的要求:

  1. 當然,我們肯定得使用 Servlet 3.0。

  2. Servlet 3.0 中接收普通上傳組件(除了文件上傳組件)通過 request.getParameter(String)接收,而文件上傳組件通過 request.getPart(String)接收。

  3. Servlet 3.0 要求服務器必須是 Tomcat7 及其以上。

準備工作

工欲善其事,必先利其器。

  1. 首先,打開 Eclipse,新建一個 Dynamic Web Project

  2. 鍵入項目名,選擇運行時環境為 Apache Tomcat v7.0,選擇 Servlet 版本為 3.0,然後點擊 Finished

  3. 在項目的 WebContent 目錄下,新建一個文件夾 upload,用來存放上傳過來的文件。

Servlet 實現文件上傳

Servlet 實現文件上傳

Servlet 實現文件上傳

Servlet 實現文件上傳

  1. WebContent 目錄下新建一個 index.jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"
  2. 使用 Tomcat 將次項目發佈,並在瀏覽器中預覽。

  1. 將服務器啟動,然後在瀏覽器中輸入:http://localhost:8080/upload

Servlet 實現文件上傳

  1. 好吧!樣子有點醜,希望不要介意!如果出現以上界面,那麼,準備工作就完成了!

完成案例

首先,新建一個 Servlet,在 Servlet 3.0 我們不必再為配置 web.xml 而煩惱了,只要要在 Servlet 的類名上面一行添加一個註解:

@WebServlet("/UploadServlet")

這個註解就相當與 Servlet 2.5 中的:

<servlet>

這樣比較,使用註解不是簡便了很多。

然後,我們還需要添加另一個註解:

@MultipartConfig

該註解主要是為了輔助 Servlet 3.0 中 HttpServletRequest 提供的對上傳文件的支持。該註解標註在 Servlet 上面,以表示該 Servlet 希望處理的請求的 MIME類型 是 multipart/form-data

接下來,我們就需要根據上傳組件的 name 屬性獲取它了。這裡我們使用 Path request.getPart(String) 方法。

Part part = request.getPart("file");

然後,我們就需要根據 part 獲取頭信息,然後根據頭信息獲取文件的路徑。

在瀏覽器抓包,獲取頭信息為:

Servlet 實現文件上傳

據此,我們可以獲取文件名或者文件路徑。

String header = part.getHeader("content-disposition");

由於獲取的有可能是文件名,也有可能是文件路徑,為此,有必要編寫一個工具類,用來獲取文件的真實名稱。

/**

然後,調用這個方法,獲得文件名。

String name = UploadUtils.getRealName(path);

接下來,我們有必要,給每個文件分配一個存放目錄,因此我又編寫了一個方法,用來生成一個目錄。

/**

到此,萬事俱備,只欠東風。我們只需要將文件拷貝到服務器。

// 獲取文件的真實路徑String realPath = this.getServletContext().getRealPath("/upload" + dir);

下面來測試一下:

Servlet 實現文件上傳

然後,在 Tomcatwebapps -> 項目名 -> upload 中就可以找到上傳成功的文件了!

Servlet 實現文件上傳

最後,我們打開音樂來試驗下是否真的上傳成功了?

Servlet 實現文件上傳

嗯!薛之謙低沉的聲音從耳機中傳來,看來確實是上傳成功了!

完整代碼

UploadServlet.java

package club.luckylight.upload;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import javax.servlet.ServletException;import javax.servlet.annotation.MultipartConfig;import javax.servlet.annotation.WebServlet;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.Part;import club.luckylight.util.UploadUtils;@WebServlet("/UploadServlet")@MultipartConfigpublic class UploadServlet extends HttpServlet { private static final long serialVersionUID = 5661013723204858883L; protected void doGet(HttpServletRequest request, HttpServletResponse response)

UploadUtils.java

package club.luckylight.util;public class UploadUtils { /**

總結

這樣,文件上傳案例就完成了,希望大家喜歡。

相關推薦

推薦中...