很久以前写的那个[文件上传] 是在JSP页面中实现的,此次我们来要在Servlet中实现文件的上传处理,两种方法的代码是不一样的,我看到有很多人说在Servlet中要使用commons-fileupload.jar的话还需要commons-io.jar提供支持而在JSP中不需要,经过我的测试,MS在Servlet中也是不需要这个commons-io.jar。
下面我们开始实现Servlet处理文件上传,首先我们需要去下载上面提到的两个jar包,下载地址分别为:
http://commons.apache.org/fileupload
http://commons.apache.org/io/
然后将这两个包导入到你的Web工程下的WEB-INF中的lib目录中去,没有lib的话请自建。另外如果你使用的是JBuilder来做的话,这样放进去是没有用的,使用的时候会提示DOES NOT EXIST。需要按照如下方法导入:
1.选则菜单栏中的“Tools”->“Configure”->“Libraies”。
2.点击“New”,Name这里随便输入(例如:CommonsFileUpload),最好是见其名知其意,Location这里可以不管他。
3.点击“Add”,将那两个包都导入进来,最后一路“OK”。
4.在你的工程命(例如:Neeke.jpx)上右键并选择“Properties”进入“Properties for 'Neeke.jpx'”对话框,选择“Required Libraries”项,选择“Add”,找到你刚才新建的那个“CommonsFileUpload”然后一路“OK”。
现在就可以正常使用了,且JBuilder会自动将这两个包放在lib下。
新建一个upload.jsp,其代码如下:
<%@ page contentType="text/html; charset=GBK" %>
<html>
<head>
<title>
upload
</title>
</head>
<body>
<form action="../uploadservlet" method="POST" enctype="Multipart/form-data">
<input type="file" name="file" /><input type="submit" value="上传" />
</form>
</body>
</html>
需要注意的是表单form的enctype属性一定要写“Multipart/form-data”,没有什么为什么!
接下来我们新建一个Servlet为UploadServlet(要有DOPOST方法)并导入如下几个包:
org.apache.commons.fileupload.*;
org.apache.commons.io.*;
org.apache.commons.fileupload.servlet.ServletFileUpload;
org.apache.commons.fileupload.disk.DiskFileItemFactory;
由于在JBuilder中doPost()调用了doGet()方法,所以我们可以直接改写doGet()方法,具体代码如下:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
response.setContentType(CONTENT_TYPE);
PrintWriter out = response.getWriter();
DiskFileItemFactory fac = new DiskFileItemFactory();
//设置缓存文件大小
fac.setSizeThreshold(1024*1024);
//缓存文件位置,这里取的是默认的位置
fac.setRepository(fac.getRepository());
ServletFileUpload upload = new ServletFileUpload(fac);
//设置最大允许上传的文件大小,这里是5MB
upload.setFileSizeMax(1024*1024*5);
List fileList = null;
try {
fileList = upload.parseRequest(request);
} catch (FileUploadException ex) {
response.sendRedirect("admin/upload.jsp?result=size");
ex.printStackTrace();
return;
}
Iterator iter = fileList.iterator();
while(iter.hasNext()){ i>
FileItem fileItem = (FileItem)iter.next();
if(!fileItem.isFormField()){
String name = fileItem.getName();
String fileSize = new Long(fileItem.getSize()).toString();
if(name == null || name.equals("") || fileSize.equals("0"))
continue;
//截取出纯文件名
name = name.substring(name.lastIndexOf("\\")+1);
//存储文件
File saveFile = new File("d:\\upload\\"+name);
try {
fileItem.write(saveFile);
} catch (Exception ex1) {
ex1.printStackTrace();
return;
}
}
}
out.close();
}
这样这个Servlet就能够实现对文件的上传了,这里文件的缓存大小及文件大小限制都可以动态的设置,我想这个问题具体就不需要我写了吧,嘿嘿。