TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
利用apache的fileupload组件实现文件的上传
1、可以实现一个或多个文件的上传,也可以接收普通的form表单数据。
2、简单测试了一下,对内存的占用还是可以忍受的,而且速度也可以。 关键点:
1、提交文件上传的form的method属性为post,enctype属性为multipart/form-data。
2、input标签需要有name属性,否则取不到内容。
看看Servlet的实现,注释已经很详细了:
- package org.xxm;
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.util.Iterator;
- import java.util.List;
- 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.FileUploadBase.SizeLimitExceededException;
- import org.apache.commons.fileupload.disk.DiskFileItemFactory;
- import org.apache.commons.fileupload.servlet.ServletFileUpload;
- import org.apache.commons.fileupload.util.Streams;
- /**
- * @author xuxiaoming
- * 2009-03-19
- * 以tomcat6.0为服务器
- */
- public class UploadFileServlet extends HttpServlet {
- public void doGet(HttpServletRequest req,
- HttpServletResponse res) {
- return;
- }
-
- public void doPost(HttpServletRequest req,
- HttpServletResponse res) throws IOException {
- /**
- * form中的enctype必须是multipart/...
- * 组件提供方法检测form表单的enctype属性
- * 在isMultipartContent方法中同时检测了是否是post提交
- * 如果不是post提交则返回false
- */
- if(ServletFileUpload.isMultipartContent(req)) {
- req.setCharacterEncoding("utf-8");
- DiskFileItemFactory factory = new DiskFileItemFactory();
- /**
- * 临时文件存储路径要真实存在
- */
- String tempdir =this.getServletContext().getRealPath("/tmp");
- String savedir =this.getServletContext().getRealPath("/upload");
- factory.setRepository(new File(tempdir));
- //内存最大占用
- factory.setSizeThreshold(1024000);
- ServletFileUpload sfu = new ServletFileUpload(factory);
- //单个文件最大值byte
- sfu.setFileSizeMax(102400000);
- //所有上传文件的总和最大值byte
- sfu.setSizeMax(204800000);
- List items = null;
- try {
- items = sfu.parseRequest(req);
- } catch (SizeLimitExceededException e) {
- System.out.println("size limit exception!");
- } catch(Exception e) {
- e.printStackTrace();
- }
-
- Iterator iter = items==null?null:items.iterator();
- while(iter != null && iter.hasNext()) {
- FileItem fileItem = (FileItem) iter.next();
- //如果是普通字段
- if(fileItem.isFormField()){ //是普通的字段
- System.out.println(fileItem.getFieldName() + " " + fileItem.getName() +
- " " + new String(fileItem.getString().getBytes("iso8859-1"), "gbk"));
- fileItem.getFieldName();//得到字段name属性的值
- fileItem.getName();//得到file字段的文件名全路径名,如果不是file字段,为null
- fileItem.getString();//得到该字段的值,默认的编码格式
- fileItem.getString("UTF-8");//指定编码格式
- }else{//文件字段
- System.out.println(fileItem.getFieldName());
- fileItem.getName();//得到file字段的文件名全路径名
- fileItem.isInMemory();
- //用来判断FileItem类对象封装的主体内容是存储在内存中,还是存储在临时文件中,
- //如果存储在内存中则返回true,否则返回false
- fileItem.getContentType();//文件类型
- fileItem.getSize(); //文件大小
- //什么东西都有了 ,想怎么处理都可以了
- //保存文件,其实就是把缓存里的数据写到目标路径下
- if(fileItem.getName()!=null && fileItem.getSize()!=0){
- File fullFile = new File(fileItem.getName());
- File newFile = new File(savedir+"/" + fullFile.getName());
- try {
- fileItem.write(newFile);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
- }
- } else {
- System.out.println("enctype error!");
- }
- }
- }
复制代码
源码下载:http://file.javaxxz.com/2014/10/2/054301000.zip |
|