上传文件有几个对表单必须的要求:
1、表单提交方法method="post"
2、form表单中要有enctype="multipart/form-data"的属性
3、表单中需要添加文件表单项:<input type="file" name="xxx" />
fileupload的核心类有:DiskFileItemFactory、ServletFileUpload、FileItem。
使用fileupload组件的步骤如下:
1. 创建工厂类DiskFileItemFactory对象:DiskFileItemFactory factory = new DiskFileItemFactory()
2. 使用工厂创建解析器对象:ServletFileUpload fileUpload = new ServletFileUpload(factory)
3. 使用解析器来解析request对象:List<FileItem> list = fileUpload.parseRequest(request)
FileItem的方法:
* boolean isFormField():是否为普通表单项!返回true为普通表单项,如果为false即文件表单项!
* String getFieldName():返回当前表单项的名称;
* String getString(String charset):返回表单项的值;
* String getName():返回上传的文件名称
* long getSize():返回上传文件的字节数
* InputStream getInputStream():返回上传文件对应的输入流
* void write(File destFile):把上传的文件内容保存到指定的文件中。
* String getContentType();
具体 实例:
public class FIleUpLoadServlet3 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//检查form表单是否是多部件表单,如果不是,向客户端输出“格式不正确”
if(!ServletFileUpload.isMultipartContent(request)){
response.getWriter().println("格式不正确");
response.getWriter().flush();
return;
}
//获取当前项目下的绝对路径+/upload的字符串全路径
String fullPath = this.getServletContext().getRealPath("/.")+File.separator+"upload";
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置内存临界值 - 超过后将产生临时文件并存储于临时文件目录中
factory.setSizeThreshold(1024*1024*3); //3M
//设置临时存储目录
factory.setRepository(new File(System.getProperty("java.io.tmpdir")));
//通过DiskFileItemFactory工厂创建ServletFileUpload对象
ServletFileUpload upload = new ServletFileUpload(factory);
//设置单个文件大小,在解析之前设置
upload.setFileSizeMax(1024*1024*5);
//设置总文件大小,在解析之前设置,否则抛出异常
upload.setSizeMax(1024*1024*6);
//通过upload的全路径创建创建文件夹
File dir = new File(fullPath);
if(!dir.exists()){
dir.mkdirs();
}
try {
//使用servletFileUpload对象解析request,每个FileItem都是一个表单项
List<FileItem> items = upload.parseRequest(request);
if(items != null && items.size()>0){
for(FileItem item : items){
//把文件表单项提取出来
if(!item.isFormField()){
String filename = item.getName();
String Path = fullPath + File.separator + filename;
//创建文件保存位置
File source = new File(Path);
//将文件写入保存位置
item.write(source);
}
}
}
} catch (FileUploadException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
注意:
文件一般存入到WEB-INF下,避免浏览器访问到
防止文件名重复,一般将文件名前加上uuid,使用上传日期建立文件夹进行分类
ServletFileUpload对象设置单个文件大小和整个表单大小都必须在解析request之前进行,如果文件超出大小限制,会抛出异常。
缓冲大小:一般默认超出10KB,才向硬盘保存。设置缓冲大小与临时目录除了示例方法外,还可以在构造函数中传入。
new DiskFileItemFactory(20*1024, new File("F:/temp"))