文件上传是网站非常常用的功能,直接使用Servlet获取上传文件还得解析请求参数,比较麻烦,所以一般选择采
用开源工具,笔者只用过比较常见的,第一个是jspsmartupload,第二个是apache 的fileupload组件。
一、jspsmartupload
File fileupload = new File(realPath);
if(!fileupload.exists()){
fileupload.mkdir();
}
SmartUpload su=new SmartUpload();
su.initialize(getServletConfig(), request, response);
com.jspsmart.upload.Request req = su.getRequest();
try
{
su.upload();
sender = URLDecoder.decode(req.getParameter("sender"), "UTF-8");
receiver = URLDecoder.decode(req.getParameter("receiver"), "UTF-8");
sendtime = URLDecoder.decode(req.getParameter("sendtime"), "UTF-8");
subject = URLDecoder.decode(req.getParameter("subject"), "UTF-8");
body = URLDecoder.decode(req.getParameter("body"), "UTF-8");
int count = su.save(realPath);
for(int i = 0;i<su.getFiles().getCount();i++)
{
com.jspsmart.upload.File tempFile = su.getFiles().getFile(i);
System.out.println(realPath+separator+tempFile.getFileName());
attachTemp.add(realPath+separator+tempFile.getFileName());
}
su.initialize(getServletConfig(), request, response);
com.jspsmart.upload.Request req = su.getRequest();
System.out.println("count:"+count);
}
catch (SmartUploadException e) {
e.printStackTrace();
}
但是在这里会遇到一个比较讨厌的问题,就是上传文件名为中文的文件,内容中的中文是正常编码的,但是文件名却是乱码。
在变换过N次编码之后依旧没有正常,查找多方资料后发现这貌似是jspsmartupload固有的毛病(貌似有个改良版的包可以解决,鉴于CSDN积分不够并没有验证,链接如下:
http://download.csdn.net/source/608182
),于是乎我就放弃了它,选择下一种办法。
二、Apache fileupload
common-fileupload这个jar包可以通过maven repository直接引用,common-fileupload还依赖于common-
io.jar,所以还需要下载这个包,然后导入到你的项目路径下面。【选择下面的第一个】
DiskFIleItemFactory类 ,该类创建FileItem对象的工厂类,开发人员可以在这个工厂类上配置上传过程中的内存缓冲区大小和存放临时文件的目录,其中的repository属性主要指定上传文件保存的目录,sizeThreshold属性则设置在内存中缓冲区大小。
ServletFileUpload类 该类首先负责处理上传的文件的文件数据,最终完成文件上传的功能。在下面代码中,注意该类使用时会抛出的一些异常。
FileItem类,该类包装上传表单中的各个请求属性,可以通过其中的isFormField属性访问方法识别某个FileItem类,对象实际代表的是普通表单成员域还是file类型的成员域。
代码实现:
package experiment4;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.FileUploadBase.FileSizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
public class FileUploadServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");//防止中文名乱码
int sizeThreshold=1024*6; //缓存区大小
String basePath = this.getServletContext().getRealPath("/upload/");
File repository = new File(basePath); //缓存区目录
long sizeMax = 1024 * 1024 * 2;//设置文件的大小为2M
final String allowExtNames = "jpg,gif,bmp,rar,rar,txt,docx";
DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
diskFileItemFactory.setRepository(repository);
diskFileItemFactory.setSizeThreshold(sizeThreshold);
ServletFileUpload servletFileUpload=new ServletFileUpload(diskFileItemFactory);
servletFileUpload.setSizeMax(sizeMax);
List<FileItem> fileItems = null;
try{
fileItems = servletFileUpload.parseRequest(request);
for(FileItem fileItem:fileItems){
long size=0;
String filePath = fileItem.getName();
System.out.println(filePath);
if(filePath==null || filePath.trim().length()==0)
continue;
String fileName=filePath.substring(filePath.lastIndexOf(File.separator)+1);
// String fileName=String.valueOf(System.currentTimeMillis());
String extName=filePath.substring(filePath.lastIndexOf(".")+1);
// fileName+="."+extName;
if(allowExtNames.indexOf(extName)!=-1)
{
try {
fileItem.write(new File(basePath+File.separator+fileName));
} catch (Exception e) {
e.printStackTrace();
}
}
else{
throw new FileUploadException("file type is not allowed");
}
}
}catch(FileSizeLimitExceededException e){
System.out.println("file size is not allowed");
}catch(FileUploadException e1){
e1.printStackTrace();
}
}
}