概述
在实际开发中,经常会遇到包含文件上传的表单,采用Fileupload可以处理这种表单。需要的jar包为commons-fileupload.jar
和commons-io.jar
.
需要注意的是,表单的enctype
属性必须设置为multipart/form-data
,method
属性为必须为post
.
代码笔记
//创建DiskFileItemFactory对象
DiskFileItemFactory factory = new DiskFileItemFactory();
//创建核心解析类ServlertFileUpload
ServletFileUpload sfu = new ServletFileUpload(factory);
//解析请求对象
List<FileItem> items = new ArrayList<FileItem>(0);
//存放普通表单项
List<String> params = new ArrayList<>();
try {
items = sfu.parseRequest(request);
} catch (Exception e) {
e.printStackTrace();
}
for(FileItem item:items){
if(item.isFormField()){
//解决中文乱码
params.add(item.getString("utf-8"));
}else{
if(item.getName()!=null&&!item.getName().equals("")) {
try {
InputStream in = item.getInputStream();
//文件名
String filename = item.getName();
//在服务器上找一个存放文件的地方
String storeDirectoryRealPath = this.getServletContext().getRealPath("/WEB-INF/files");
File storeDirectory = new File(storeDirectoryRealPath);
if(!storeDirectory.exists()){
storeDirectory.mkdirs();
}
params.add(filename);
//构建输出流
OutputStream out = new FileOutputStream(new File(storeDirectory,filename));
int len = -1;
byte buf[] = new byte[1024];
while((len=in.read(buf))!=-1){
out.write(buf, 0, len);
}
in.close();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}else {
params.add("");
}
}
//根据params添加到数据库,以下省略...
}
后续问题
- 保证文件名的唯一性
- 文件存放目录的散列