實現web開發中的文件上傳功能,需完成如下二步操作:
FORM元素的enctype屬性指定了表單數據向服務器提交時所採用的編碼類型,默認的缺省值是“application/x-www-form-
urlencoded”。 然而,在向服務器發送大量的文本、包含非ASCII字符的文本或二進制數據時這種編碼方式效率很低。文
件上載時,所使用的編碼類型應當是“multipart/form-data”,它既可以發送文本數據,也支持二進制數據上載。Browser
端<form>表單的ENCTYPE屬性值爲multipart/form-data,它告訴我們傳輸的數據要用到多媒體傳輸協議,由於多媒體傳
輸的都是大量的數據,所以規定上傳文件必須是post方法,<input>的type屬性必須是file。
上傳文件中應當注意的細節:
手工轉碼,用戶名的亂碼問題:
paramValue= new String(paramValue.getBytes("iso8859-1"),"utf-8");
利用FileItem類的getString(String encoding)
String getString(String encoding) throws UnsupportedEncodingException
如表示url資源時應該用斜槓 “/”
如表示硬盤路徑時用斜槓“\\”
factory.setRepository(new File(this.getServletContext().getRealPath("/temp")));
……
FileItem item;
……
item.delete();
5、 限制文件上傳的最大值問題:
調用解析器的:upload.setFileSizeMax(1024*1024); //上傳文件不能超過1M。如果超出大小,需要給用戶友好提示:
try{
……
}catch (FileUploadBase.FileSizeLimitExceededException e) {
request.setAttribute("message", "上傳文件不能超過1M!!");
}
6、 ProgressListener顯示上傳進度問題:ProgressListener progressListener = new ProgressListener() {
public void update(long pBytesRead, long pContentLength, int pItems) {
System.out.println("到現在爲止, " + pBytesRead + " 字節已上傳,總大小爲 " + pContentLength);
}
};
upload.setProgressListener(progressListener);<form action="${pageContext.request.contextPath}/servlet/UploadServlet2" enctype="multipart/form-data" method="post">
用戶名:<input type="text" name="username" /><br/>
文件1<input type="file" name="file1" /><br/>
文件2<input type="file" name="file2" /><br/>
<input type="submit" value="上傳" /><br/>
UploadServlet.java
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
import java.util.UUID;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class UploadServlet2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// request.setCharacterEncoding("UTF-8");
try {
// 1、建立工廠對象
DiskFileItemFactory factory = new DiskFileItemFactory();
//factory.setRepository(new File("F:\\"));
// 2、得到上傳文件解析器
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setHeaderEncoding("utf-8");//處理上傳文件
// 3、設定上傳文件尺寸
upload.setFileSizeMax(1024*1024);
// 4、進行解析,得到fileItem對象
List<FileItem> list = upload.parseRequest(request);
// 5、對list進行迭代處理
for (FileItem item : list) {
if (item.isFormField()) {// 表單普通輸入項
String paramName = item.getFieldName();
//String paramValue = item.getString();
//paramValue = new String(paramValue.getBytes("ISO8859-1"),"UTF-8");
String paramValue=item.getString("utf-8");
System.out.println("普通輸入項" + paramName + "==" + paramValue);
} else {// 上傳文件處理
//獲取上傳文件名
String fileName = item.getName();
// 如果文件xxx中有目錄,則去掉目錄部分只保留文件名
fileName = fileName.substring(fileName.lastIndexOf("\\") + 1);
System.out.println("name =" + fileName);
if (!fileName.equals(" ")) {
fileName =refactorFileName(fileName) ;
System.out.println("filename = " + fileName);
InputStream in = item.getInputStream();
File file = new File("F:\\" + fileName);
FileOutputStream fos = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while ((len - in.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
fos.flush();
fos.close();
in.close();
item.delete();
request.setAttribute("message", "文件上傳成功");
}
}
}
}catch(FileSizeLimitExceededException e1){
e1.printStackTrace();
request.setAttribute("message", "上傳文件尺寸太大!!!");
}catch (FileUploadException e) {
e.printStackTrace();
request.setAttribute("message", "文件上傳失敗!!!");
}
request.getRequestDispatcher("/message.jsp").forward(request, response);
}
public String refactorFileName(String fileName){
return UUID.randomUUID().toString() + "_" + fileName;
}
}