表单属性必须为 enctype="multipart/form-data", method="post"
实现表单的file文件的操作
使用apche-commons-fileupload包,依赖apche-commons-io包
DiskFileItemFactory: FileItem工厂
ServletFileUpload: FileItem解析器
FileItem: 从request请求中解析出的表单项
DiskFileItemFactory
public DiskFileItemFactory(int sizeThreshold, File repository): (设置缓存大小(超过多大会缓存)及临时目录(文件夹))
FileItem的工厂类
public void setSizeThreshold(int sizeThreshold): 设置使用临时文件的边界值,大于该值时上传文件会先保存到临时文件中。单位:字节
public void setRepository(java.io.File repository):指定临时文件
ServletFileUpload
ServletFileUpload(FileItemFactory fileItemFactory):
传一个FileItemFactory的构造参数
public List parseRequest(HttpServletRequest request):
解析请求,获取所有item
public void setFileSizeMax(long fileSizeMax): 设置单个上传文件的最大值
public void setSizeMax(long sizeMax): 设置一次上传所有文件总和的最大值
FileItem
获取方式:
ServletFileUpload.parseRequest(request);
boolean isFormField(): 判断item是否为一个普通表单项
String getFieldName(): 获取表单项的名称(普通表单项)
String getString():
String getString(String encoding): 返回表单项的值(普通表单项)
String getName(): 获得上传文件的文件名
long getSize(): 获取上传文件的字节数
InputStream getInputStream(): 获取输入流
void write(File file): 把上传文件保存到指定文件
void delete(): 删除与此item相关的临时文件
Test
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if(!ServletFileUpload.isMultipartContent(request)){
throw new RuntimeException("当前请求不支持文件上传!");
}
try {
//创建FileItem工厂
DiskFileItemFactory factory = new DiskFileItemFactory();
//设置使用临时文件的边界值,大于该值时上传文件会先保存到临时文件中。单位:字节
factory.setSizeThreshold(1024*1024*2);
//指定临时文件
String tempPath = getServletContext().getRealPath("/temp");
File temp = new File(tempPath);
factory.setRepository(temp);
//创建文件上传核心组件
ServletFileUpload upload = new ServletFileUpload(factory);
//设置单个上传文件的最大值
upload.setFileSizeMax(1024 * 1024 * 2);
//设置一次上传所有文件总和的最大值
upload.setSizeMax(1024 * 1024 * 1024);
//解析请求,获取所有item
List<FileItem> items = upload.parseRequest(request);
//遍历items
for(FileItem item : items){
//若item为普通表单项
if(item.isFormField()){
}else{//若item为文件表单项
//获取上传文件原始名
String fileName = item.getName();
//为防止文件重名
fileName = fileName + System.currentTimeMillis();
//获取文件保存路径
String path = getServletContext().getRealPath("/files");
//将文件按照年月日分目录进行存储
Calendar now = Calendar.getInstance();
int year = now.get(Calendar.YEAR);
int mouth = now.get(Calendar.MONTH) + 1;
int date = now.get(Calendar.DATE);
path = path + "/" + year + "/" + mouth + "/" + date;
//判断该目录是否存在,若不存在则创建
File dirFile = new File(path);
if(!dirFile.exists()){
dirFile.mkdirs();
}
//创建目标文件,用于保存上传文件
File descFile = new File(path, fileName);
item.write(descFile);
//删除临时文件
item.delete();
}
}
} catch (FileUploadException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
}
servlet3.0中的文件上传
添加注解,表明当前Servlet可以处理Multipart请求
@MultipartConfig
上传如下操作:
Part part = request.getPart("表单项的name");
part.write("路径");
获取原始名称:
String header = part.getHeader("Content-Disposition");
int i = header.lastIndexOf("filename=\"") + 10;
int end = header.length() - 1;
String fileName = header.substring(start, end);