天天看點

利用 WebServlet3.0新特性Part實作檔案上傳

利用webservlet3.0新特性來上傳檔案的操作是十分簡單的,首先我們要在servlet中加入标注@MultipartConfig,

該标注主要是為了輔助Servlet3.0中HttpServletRequest提供的對上傳檔案的支援。該标注寫在Servlet類的聲明之前,一表示該Servlet希望處理的請求時multipart/form-data類型的。因為上傳檔案類型會指定檔案類型enctype="multipart/form-data",該标注還提供了若幹屬性用于簡化對上傳檔案的處理。

multipart/form-data是将檔案以二進制的形式上傳,這樣可以實作多種類型的檔案上傳。是以當你不加入标注@MultipartConfig,利用request.getpart()就得不到檔案,得到的值将是null。      
是以第一步就是加上注解@MultipartConfig。      
下面給大家一個完整的上傳檔案代碼詳解:      

package com.Myweb.MyServlet;

import java.io.File;

import java.io.IOException;

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;

@WebServlet(urlPatterns="/MyUploadServlet.action")

//multipart/form-data是将檔案以二進制的形式上傳,這樣可以實作多種類型的檔案上傳

@MultipartConfig

public class UploadServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

// TODO Auto-generated method stub

doPost(req, resp);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp)

throws ServletException, IOException {

// TODO Auto-generated method stub

//利用的HttpServletRequest類的getPart方法去擷取一個單檔案資訊;

Part part =req.getPart("file");//擷取單個檔案

//利用getHeader()方法得到的是檔案頭部資訊;

例如我上傳檔案利用System.out.println(fi+"==header内容");列印出header資訊為:

頭部資訊為form-data; name="file"; filename="register.jsp";

這裡面就包括了檔案名,是以我們需要通過對字元串的操作來擷取fileName;是以我們在下面定義了一個擷取檔案名的方法,

通過方法getFileName(String  str)去擷取到檔案名;

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

//System.out.println(fi+"==header内容");

//System.out.println(getFileName(fi)+"===="); 

String filepath=getFileName(fi);

//然後我這裡寫的是把檔案上傳到tomcat下面已釋出的webapp下面自己建立的myupload目錄下面;這樣可以随時檢視;

String path=req.getServletContext().getRealPath("myupload");//項目所在目錄,把檔案最好存在tomcat上面;

//然後利用檔案分割符将目錄+檔案名拼接起來,然後利用Part.write寫入到指定路徑,

part.write(path+File.separator+filepath);//File.separator與系統有關的分割符

//F:\Apache\aph8\work\Catalina\localhost\Myweb

//如果不指定路徑,則會設定預設路徑;

}

public String  getFileName(String  str){

//因為傳過來的是頭部資訊form-data; name="file"; filename="register.jsp";

是以我們需要截取filename="後面的字元串,通過lastindex方式擷取索引,然後通過substring方法來截取檔案名;

然後傳回截取的檔案名。

int beginindexof=str.lastIndexOf("=");

int lastindexof=str.lastIndexOf("\"");

str=str.substring(beginindexof+2, lastindexof);

System.out.println(str);

return str;

}}

這樣servlet就差不多寫完了;

//jsp頁面上代碼如下:

//一定要加上這句enctype="multipart/form-data";不然不能進行檔案上傳的,格式不對

 <form action="MyUploadServlet.action" method="post" enctype="multipart/form-data">

 <label>選擇檔案</label>   

 <input type="file" name="file"/>

    <br/>

    <input type="submit" value="上傳"/>

    </form>

繼續閱讀