commons-fileupload依赖commons-io包。这里使用最新的commons-fileupload-1.2.1和commons-io-1.4。
直接使用了,注意form表单必须添加enctype="multipart/form-data"属性。
由于要使用HttpServletRequest request。写一个类方便action调用,这里把HttpServletRequest request作参数,接收action里的HttpServletRequest request。
List<Map<String, String>> vars = new ArrayList<Map<String, String>>();
Map<String, String> map = new HashMap<String, String>();
String uploadPath = request.getSession().getServletContext().getRealPath("/")+"//upload";
String tempuploadPath = request.getSession().getServletContext().getRealPath("/")+"//upload//buffer//";
File uploadFile = new File(uploadPath);
if (!uploadFile.exists()) {
uploadFile.mkdirs();
}
File tempPathFile = new File(tempuploadPath);
if (!tempPathFile.exists()) {
tempPathFile.mkdirs();
}
try{
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb
factory.setRepository(tempPathFile);// 设置缓冲区目录
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(20971520); // 设置最大文件尺寸
List<FileItem> items = upload.parseRequest(request);// 得到所有的文件
Iterator<FileItem> i = items.iterator();
while (i.hasNext()) {
FileItem fi = (FileItem) i.next();
String fileName = fi.getName();
if (fileName != null) {
File fullFile = new File(fi.getName());
File savedFile = new File(uploadPath, fullFile.getName());
fi.write(savedFile);
//
map.put("FILENAME", fullFile.getName());
map.put("FILEPATH", "upload//"+fullFile.getName());
vars.add(map);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return vars;
这里我采用文件上传到服务器某路径下,而数据库存储文件信息,包括文件名、文件相对路径等。添加一个返回值方便传递这些信息。这里采用request.getSession().getServletContext().getRealPath("/")取项目物理路径,具体上传操作参看API。
使用超链接下载。由于map.put("FILEPATH", "upload//"+fullFile.getName())存储的项目的相对路径,传给href属性即可,<a href="" target="_blank"></a>。