Java web文件操作类笔记-part文件

Java web文件操作类笔记-part文件

表单属性必须为 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);

推荐阅读