利用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>