Apache Commons FileUpload

来源:互联网 发布:日本 9月进出口数据 编辑:程序博客网 时间:2024/05/22 14:24

Apache Commons FileUpload

更详细API请登录http://commons.apache.org/查看。


为你的servlet和Web应用程序提供文件上传功能。

前提条件

需要2点 1 POST 提交 2 在表单加入 multipart/form-data 属性
demo:

前台:

<form method="POST" enctype="multipart/form-data" action="fup.cgi">  File to upload: <input type="file" name="upfile"><br/>  Notes about the file: <input type="text" name="note"><br/>  <br/>  <input type="submit" value="Press"> to upload the file!</form>

后台:
分为三部分:

  1. 保存到临时文件
            /**.存储的是临时文件**/            // 建立一个 disk-based file items 工厂类            DiskFileItemFactory factory = new DiskFileItemFactory();            // 配置这个factory            ServletContext servletContext = this.getServletConfig().getServletContext();            //File repository = (File) servletContext.getAttribute("javax.servlet.context.tempdir");            File repository = new File("e:\\TEST\\");            factory.setRepository(repository);            // new一个 file upload 处理器类            ServletFileUpload upload = new ServletFileUpload(factory);            // 解析 request            try {                List<FileItem> items = upload.parseRequest(request);                for (FileItem item : items) {                    System.out.println(item.getFieldName());                }            } catch (FileUploadException e) {                e.printStackTrace();            }

我把上传的文件保存在了e盘的TEST文件夹下:

执行完这段代码会生成.tmp类型的文件执行完之后 会把它清空
文件名自动生成 类型为.tmp

这是更详细的配置

            // 建立一个 disk-based file items 工厂类 其他设置            DiskFileItemFactory factory = new DiskFileItemFactory();            // 配置这个factory            //setSizeThreshold方法用于设置是否使用临时文件保存解析出的数据的那个临界值 默认是10240            factory.setSizeThreshold(102400);            File repository = new File("e:\\TEST\\");            factory.setRepository(repository);            //  new一个 file upload 处理器类            ServletFileUpload upload = new ServletFileUpload(factory);            // 设置最大上传文件Max大小            upload.setSizeMax(1024000000);            // 解析 request            try {                List<FileItem> items = upload.parseRequest(request);                for (FileItem item : items) {                    System.out.println(item.getFieldName());                }            } catch (FileUploadException e) {                e.printStackTrace();            }
  1. 存入指定位置
            try {                List<FileItem> items = upload.parseRequest(request);                // Process the uploaded items                Iterator<FileItem> iter = items.iterator();                while (iter.hasNext()) {                    FileItem item = iter.next();                    if (item.isFormField()) {                        System.out.println("processFormField");                        String name = item.getFieldName();                        System.out.println(name);                        //processFormField(item);                    } else {                        //processUploadedFile(item);                        //System.out.println("processUploadedFile");                        //表单中的名称                        String getFieldName = item.getFieldName();                        //文件名                        String itemgetName = item.getName();                        //文件类别                        String contentType = item.getContentType();                        //是否在内存中                        boolean isInMemory = item.isInMemory();                        //大小                        long sizeInBytes = item.getSize();                        //System.out.println(getFieldName + "---" + itemgetName + "---" + contentType + "---" + isInMemory + "---" + sizeInBytes);                        File uploadedFile = new File("e:\\TEST\\" + itemgetName);                        try {                            item.write(uploadedFile);                        } catch (Exception e) {                            e.printStackTrace();                        }                    }                }            } catch (FileUploadException e) {                e.printStackTrace();            }

当临时文件(.tmp)在不再被使用的时候(如果相应的java.io.File是可回收的则更好)会自动被删除.这会被org.apache.commons.io.FileCleaningTracker的一个实例启动的一个收割线程静默执行(两种方式)

1 配置web.xml

<web-app>    <listener>        <listener-class>            org.apache.commons.fileupload.servlet.FileCleanerCleanup        </listener-class>    </listener></web-app>

2使用DiskFileItemFactory中set fileCleaningTracker。

    public static DiskFileItemFactory newDiskFileItemFactory(ServletContext context, File repository) {        FileCleaningTracker fileCleaningTracker  = FileCleanerCleanup.getFileCleaningTracker(context);        DiskFileItemFactory factory  = new DiskFileItemFactory(DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD,  repository);        factory.setFileCleaningTracker(fileCleaningTracker);        return factory;    }
  1. 监控上传(可选)

Apache Commons FileUpload 可以使用ProgressListener监控文件上传状态

            ProgressListener progressListener = new ProgressListener(){                public void update(long pBytesRead, long pContentLength, int pItems) {                    //读取的文件                   // System.out.println("We are currently reading item " + pItems);                    if (pContentLength == -1) {                        //System.out.println("So far, " + pBytesRead + " bytes have been read.");                    } else {//                        System.out.println("So far, " + pBytesRead + " of " + pContentLength//                                + " bytes have been read.");                        float total = ((float)pBytesRead /(float) pContentLength);                        // 将上传状态放入session                        request.getSession().setAttribute("total",total);                    }                }            };            upload.setProgressListener(progressListener);

补充:使用ajax上传文件
有两个限制条件
1. 支h5的浏览器
2. jquery版本在1.2以上(我用的1.11网上说 用2.x最好)
3. 进度条插件 我在www.jq22.com/随意找了一个进度条插件

h5中有一个formData属性可以把文件已二进制的形式传到后台
实现如下

前台代码:

  <form id="myform" method="POST" enctype="multipart/form-data" action="upload">    File to upload: <input type="file" name="upfile1"><br/>    Notes about the file: <input type="text" name="note"><br/>    <br/>    <input type="button" onclick="dosubmit()" value="Press"> to upload the file!  </form>  <div class="box">    <div class="ok"></div>    <div class="tbox">      <div class="tiao"></div>    </div>  </div>
  <script>    /*add——创建tbx下的div加文字和变宽度的方法*/    function add(i){      var tbox =$(".tbox");      var tiao =$(".tiao");      tiao.css("width",i+"%").html(i+"%");    }var time_count = null;    function xh2(){        time_count = setInterval('chlink()', 100); //注意:执行的函数需要加引号,否则会报错的    }    function chlink() {        $.ajax({            url: "ajaxRequest"            , type: "POST"            , success: function(data, status){                var total = data * 100;                if(total<100){                    add(total);                }else if(total==100){                    add(total);                    $(".ok").html("上传成功").fadeIn("slow");                    clearInterval(time_count);                }                console.log(total);            }        });    }    function dosubmit(){        $(".ok").html("上传成功").fadeOut("slow");          //$("#myform").submit();        doUpload();          xh2();      }    function doUpload() {        var formData = new FormData($( "#myform" )[0]);        $.ajax({            url: 'upload' ,            type: 'POST',            data: formData,            async: true,            cache: false,            contentType: false,            processData: false,            success: function (returndata) {            },            error: function (returndata) {                $(".ok").html("加载失败").fadeIn("slow");                clearInterval(time_count);            }        });    }  </script>

我的思路是:ajax上传文件,前台每隔固定时间去后台获取ProgressListener中设置到session中文件上传信息然后展示到前台 这里用到了setInterval函数(清除该函数用 clearInterval函数 具体用法见上面代码 )

不足:需要多次请求服务器 多用户同时上传时会有问题(session中的key需要唯一)

这里写图片描述
这里写图片描述
这里写图片描述


0 0
原创粉丝点击