文件上传:
准备工作:
jar包:common-io,common-fileupload
文件上传的注意事项:
为保证服务器的安全,上传文件应该放在外界无法直接访问的目录下,如WEB-INF目录下
为保证文件覆盖的现象发生要为上传文件产生一个唯一文件名
限制上传文件的最大值
限制上传文件的类型,判端后缀名是否合法
使用的类
ServletFileUpload负责处理上传的文件数据,并将表单中的每个输入项封装成一个FileItem对象;
DiskFileItemFactory解析ServletFileUpload对象请求;
上传
使用表单上传文件,
get:上传文件大小有限制
post:上传文件没有大小限制
代码:
创建DiskFileItemFactory对象
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(1024*1024);
factory.setRepository(tmpFile);
创建servletFileUpLoad对象将请求表单中的每一项转换为FileItem对象
ServletFileUpload upload = new ServletFileUpload(factory);
//监听上传进度
upload.setProgressListener(new ProgressListener() {
@Override
//l:已经读取到的文件大小
//l1:文件大小
public void update(long l, long l1, int i) {
System.out.println("总大小:" + l1 + "已经上传" + l);
}
});
//处理乱码问题
upload.setHeaderEncoding("UTF-8");
//设置单个文件的最大值
upload.setFileSizeMax(1024*1024*10);
//设置总共能上传文件大小
upload.setSizeMax(1024*1024*10);
处理上传文件
创建文件夹,为维持文件夹的原子性,使用uuid创建文件夹名
//把前端请求封装成一个FileItem对象,需要从servletFileUpLoad中获取
try {
List<FileItem> fileItems = upload.parseRequest(req);
//遍历每个fileitem对象
for (FileItem fileItem:fileItems){
//判断上传文件是带文件的表单还是普通的表单
if(fileItem.isFormField()){//普通的表单
String name = fileItem.getFieldName();
//处理乱码
String value = fileItem.getString("UTF-8");
System.out.println(name + value);
}else {//带文件的表单
//-------处理文件------//
String name = fileItem.getName();
System.out.println("name---->" + name);
if(name.trim().equals("")||name==null){
continue;
}
String fileName = name.substring(name.lastIndexOf("\\") + 1);
System.out.println("文件名------>"+fileName);
//-------存放地址------//
UUID uuid = UUID.randomUUID();
String realPath=uploadPath+"/"+uuid;
System.out.println("存放地址------>" + realPath);
File realPathFile = new File(realPath);
if(!realPathFile.exists()){
realPathFile.mkdir();
}
//-----文件传输-----//
InputStream is = fileItem.getInputStream();
FileOutputStream os = new FileOutputStream(realPathFile + "/" + fileName);
byte[] buffer = new byte[1024];
int len=0;
while ((len=is.read(buffer))>0){
os.write(buffer,0,len);
}
os.close();
is.close();
}
}
} catch (FileUploadException e) {
e.printStackTrace();
}
注意乱码问题
若出现乱码文件需要添加过滤器对向servlet的请求进行过滤,以此避免中文乱码
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
servletRequest.setCharacterEncoding("UTF-8");
servletResponse.setCharacterEncoding("UTF-8");
filterChain.doFilter(servletRequest,servletResponse);
}