apache commons fileupload 手记删除临时文件及优化速度

本文介绍了一个Java文件上传处理的方法,包括解析请求、处理表单字段和文件上传逻辑。通过使用commons-fileupload库,实现了文件的内存和磁盘存储管理,并确保了上传过程中的错误处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public void Parse(FileItem fi) {
            if (fi.isFormField()) {

                //将form中的路径参数保存为Attribute
                request.setAttribute(fi.getFieldName(), fi.getString());
            } else {
                String path = (String) request.getAttribute(FILEPATHFIELD);
                if (path != null) {
                    try {
                        String fn = path + extractfilename(fi.getName());
                        File f = new File(_resources.getDocBase() + fn);
                        if (fi.isInMemory()) {

                            //在内存中的直接保存到文件 

                            fi.write(f);
                        } else {

                            //重命名速度较复制快,适合于大文件
                            ((DiskFileItem) fi).getStoreLocation().renameTo(f);
                        }
                        _resources.lookup(fn);
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        fi.delete();//删除临时文件
                    }
                }
            }
        }

public static boolean uploadfile(HttpServletRequest req) {
        DiskFileItemFactory factory = null;
        try {
            factory = new DiskFileItemFactory();
            //......
            upload.setProgressListener(...);
            List<?> fileItems = null;
            // if fail then the Repository file can't delete
            /**
             * modify org.apache.commons.fileupload public List
             * parseRequest(RequestContext ctx) throws FileUploadException { try
             * { FileItemIterator iter = getItemIterator(ctx); List items = new
             * ArrayList(); FileItemFactory fac = getFileItemFactory(); if (fac
             * == null) { throw new NullPointerException(
             * "No FileItemFactory has been set."); } while (iter.hasNext()) {
             * FileItemStream item = iter.next(); FileItem fileItem =
             * fac.createItem(item.getFieldName(), item.getContentType(),
             * item.isFormField(), item.getName()); try {
             * Streams.copy(item.openStream(), fileItem.getOutputStream(),
             * true); } catch (FileUploadIOException e) { //here, delete
             * Repository item.delete(); throw (FileUploadException)
             * e.getCause(); } catch (IOException e) { //here, delete Repository
             * item.delete(); throw new IOFileUploadException( "Processing of "
             * + MULTIPART_FORM_DATA + " request failed. " + e.getMessage(), e);
             * } if (fileItem instanceof FileItemHeadersSupport) { final
             * FileItemHeaders fih = item.getHeaders();
             * ((FileItemHeadersSupport) fileItem).setHeaders(fih); }
             * items.add(fileItem); } return items; } catch
             * (FileUploadIOException e) { throw (FileUploadException)
             * e.getCause(); } catch (IOException e) { throw new
             * FileUploadException(e.getMessage(), e); } }
             */

            fileItems = upload.parseRequest(req);
            for (Object i : fileItems) {
                Parse((FileItem) i);
            }
            return true;

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (factory != null) {
            }
        }
        return false;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值