文件上传是网站非常常用的功能,一般上传采用Apache的开源工具,使用最为广泛的也就是commons-fileupload组件了。实践如下:
1.引入jar包:
commons-fileupload-1.1.1.jar
Commons-io-1.2.jar
2.jsp页面的相关设置:
①当input框的type为file时,页面上会自动加上浏览按钮。
②上传不同于普通的submit,需要①提交方式:method="post"②要在form中加入属性:enctype="multipart/form-data"(multipart/form-data,是多段数据提交格式,设置表单的MIME编码,也就是说提交的数据不完全是字符文本数据,还包括其他的文件数据,form里面的input的值以2进制的方式传过去,所以request就得不到值了,也就不能使用request.getParameter()来取得表单数据,必须以其他的方式来取得表单数据。)
3.上传主要用到的类:DisFileUpload类、 FileItem类、FileUploadException类
(推荐一篇相当精彩的博客:http://blog.csdn.net/imust_can/article/details/7009215)
4.文件上传相应的servlet代码:
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
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.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import com.bjpowernode.drp.basedata.manager.ItemManager;
import com.bjpowernode.drp.basedata.manager.ItemManagerImpl;
import com.bjpowernode.drp.util.ApplicationException;
/**
* 文件上传
*
* @author happy
*
*/
public class FileUploadServlet extends HttpServlet {
private ItemManager itemManager;
private File uploadPath;
private File tempPath;
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
DiskFileItemFactory factory = new DiskFileItemFactory();
factory.setSizeThreshold(4096);
factory.setRepository(tempPath);// 文件大小超过4096字节,就要先将文件上传到临时路径中
ServletFileUpload upload = new ServletFileUpload(factory);
upload.setSizeMax(1000000 * 20);// 最大能够上传20M文件
try {
List fileItems = upload.parseRequest(request);
String itemNo = "";
for (Iterator iter = fileItems.iterator(); iter.hasNext();) {
FileItem item = (FileItem) iter.next();
// 是普通的表单输入域
if (item.isFormField()) {
if ("itemNo".equals(item.getFieldName())) {
itemNo = item.getString();
}
}
// 是否为input="type"输入域
if (!item.isFormField()) {
String fileName = item.getName();
long size = item.getSize();
if ((fileName == null || fileName.equals("")) && size == 0) {
continue;
}
// 截取字符串
// 如:上传的文件所在路径为:C:\WINDOWS\Debug\PASSWD.LOG,我们只要获取到最后的文件名即可
fileName = fileName.substring(
fileName.lastIndexOf("\\") + 1, fileName.length());
item.write(new File(uploadPath, fileName));
itemManager.uploadItemImage(itemNo, fileName);
}
}
//上传成功之后重定向到新的显示页面
response.sendRedirect(request.getContextPath()
+ "/servlet/item/SearchItemServlet");
} catch (Exception e) {
e.printStackTrace();
throw new ApplicationException("上传失败!");
}
}
// 初始化时自动创建图片上传的最终存储路径
public void init() throws ServletException {
uploadPath = new File(getServletContext().getRealPath("upload"));
System.out.println("uploadPath=====" + uploadPath);
// 如果目录不存在
if (!uploadPath.exists()) {
// 创建目录
uploadPath.mkdir();
}
// 临时目录
tempPath = new File(getServletContext().getRealPath("temp"));
if (!tempPath.exists()) {
tempPath.mkdir();
}
itemManager = new ItemManagerImpl();
}
}
5.关键代码已经贴出来了,其他不再赘述。最终上传到Tomcat服务器上,具体路径如下:mydrp\.metadata\.me_tcat\webapps\drp\upload
6.上传最终的效果图