上传:
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/UploadServlet" method="post" enctype="multipart/form-data">
文件:<input type="file">
<input type="submit" value="提交">
</form>
</body>
</html>
关于enctype:
application/x-www-form-urlencoded:表单enctype属性的默认值。这种编码方案使用有限的字符集,当使用了非字母和数字时,必须用“%HH”(H代表十六进制数字)。
对于大容量的二进制数据或包含非ASCII字符的文本来说,这种编码不能满足要求。
multipart、form-data:form设定了enctype="multipart/form-data"属性后,表示表单以二进制传输数据。
使用fileupload组件:
①:加入jar包,commons-fileupload-1.3.1.jar,commons-io-1.4.jar。
②:基本思想:
commons-fileupload 可以解析请求,得到一个fileItem对象组成的list
commons-fileupload 把所有的请求信息都解析为fileItem对象,无论是一个一般的文本域还是一个文件域。
可以调用fileItem的isFormField()方法来判断是一个表单域或不是表单域(则是一个文件域)
再来进一步获取信息
③:如何得到list<FileItem>对象。
3.1 简单方式:
//创建文件上传工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload upload=new ServletFileUpload(factory);
List<FileItem> fis= upload.parseRequest(request);
3.2 复杂方式:可以为文件的上传加入一些限制条件和其他属性。
//创建文件上传工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
//设置内存中红缓存区大小,默认
factory.setSizeThreshold(1024*500);
//设置临时文件存放目录
File file=new File("e:\\temp");
if (!file.exists()){
file.mkdir();
}
factory.setRepository(file);
ServletFileUpload upload=new ServletFileUpload(factory);
upload.setSizeMax(1024*1024*5);
List<FileItem> fis= null;
try {
fis = upload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
测试:
b.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/UploadServlet" method="post" enctype="multipart/form-data">
文件:<input type="file" name="file">
<input type="submit" value="提交">
</form>
</body>
</html>
uploadServlet:
package com.sa.servlet;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.text.html.HTMLDocument;
import java.io.*;
import java.util.List;
@WebServlet(name = "UploadServlet",urlPatterns = "/UploadServlet")
public class UploadServlet extends HttpServlet {
private static final long serialVersionUID = 2740937145205434705L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1. 得到fileItem的集合items
//创建文件上传工厂
DiskFileItemFactory factory=new DiskFileItemFactory();
//设置内存中红缓存区大小,默认
factory.setSizeThreshold(1024*500);
//设置临时文件存放目录
File file=new File("e:\\temp");
if (!file.exists()){
file.mkdir();
}
factory.setRepository(file);
ServletFileUpload upload=new ServletFileUpload(factory);
upload.setSizeMax(1024*1024*5);
List<FileItem> fis= null;
try {
fis = upload.parseRequest(request);
} catch (FileUploadException e) {
e.printStackTrace();
}
//2.遍历items:
for(FileItem fi:fis){
// 若是一个一般的表单域,打印信息
if(fi.isFormField()){
System.out.println(fi.getFieldName()+
fi.getString());
}else{
//若是文件域,则把文件保存在磁盘目录中
InputStream in=fi.getInputStream();
byte[] buffer=new byte[1024];
int len=0;
//设置真实存放目录
String destination="e:\\temp\\"+fi.getName();
OutputStream out=new FileOutputStream(destination);
while ((len=in.read(buffer))!=-1){
out.write(buffer,0,len);
}
out.close();
in.close();
System.out.println("done");
}
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}