如何阻止FileUploadBase在JBoss 7上创建upload_temp_file

时间:2015-04-28 20:42:41

标签: java file-upload jboss apache-commons

这是我对Stackoverflow的第一个问题:)

所以,我有一个Java Web应用程序,我正在使用JBoss 7.1来运行这个应用程序。在这个应用程序中,我有一个servlet将一个文件上传到我的应用程序,我正在使用这个库:org.apache.commons.fileupload.FileUploadBase.

当我调用方法FileUploadBase.parseRequest时,会在C:\Users\[server-machine]\AppData\Local\Temp中创建一个名为 upload_d77dbeb6_aa80_4d64_a112_2ea7c12c6ced_00000089.tmp 的文件,其大小与我上传到我的应用程序中的原始文件大小相同

文件名由FileUploadBase生成,并且总是增加加5,如:

  1. ... upload_d77 ced_00000089.tmp

  2. upload_d77 ... ced_00000094.tmp

  3. ... upload_d77 ced_00000099.tmp

  4. 下面按照parseRequest方法的代码,在 while循环完成时创建文件。

    public List<FileItem> parseRequest(RequestContext ctx)
            throws FileUploadException {
        List<FileItem> items = new ArrayList<FileItem>();
        boolean successful = false;
        try {
            FileItemIterator iter = getItemIterator(ctx);
            FileItemFactory fac = getFileItemFactory();
            if (fac == null) {
                throw new NullPointerException("No FileItemFactory has been set.");
            }
            while (iter.hasNext()) {
                final FileItemStream item = iter.next();
                // Don't use getName() here to prevent an InvalidFileNameException.
                final String fileName = ((FileItemIteratorImpl.FileItemStreamImpl) item).name;
                FileItem fileItem = fac.createItem(item.getFieldName(), item.getContentType(),
                                                   item.isFormField(), fileName);
                items.add(fileItem);
                try {
                    Streams.copy(item.openStream(), fileItem.getOutputStream(), true);
                } catch (FileUploadIOException e) {
                    throw (FileUploadException) e.getCause();
                } catch (IOException e) {
                    throw new IOFileUploadException(format("Processing of %s request failed. %s",
                                                           MULTIPART_FORM_DATA, e.getMessage()), e);
                }
                final FileItemHeaders fih = item.getHeaders();
                fileItem.setHeaders(fih);
            }
            successful = true;
            return items;
        } catch (FileUploadIOException e) {
            throw (FileUploadException) e.getCause();
        } catch (IOException e) {
            throw new FileUploadException(e.getMessage(), e);
        } finally {
            if (!successful) {
                for (FileItem fileItem : items) {
                    try {
                        fileItem.delete();
                    } catch (Throwable e) {
                        // ignore it
                    }
                }
            }
        }
    }
    

    当我调试时,temp_file就是在successful = true;

    上停止调试的时候创建的

    Jboss有没有办法禁用文件创建orsome参数来设置?

    请按照我的代码调用parseRequest

    try {
                List<String> files = new ArrayList<>();
    
                FileItemFactory factory = new DiskFileItemFactory();
                ServletFileUpload upload = new ServletFileUpload(factory);
    
                upload.setProgressListener(listener);
    
                List<FileItem> items = upload.parseRequest(request);
                Iterator<FileItem> iter = items.iterator();
    

2 个答案:

答案 0 :(得分:1)

我尝试使用DefaultItemFactory但不推荐使用此类,而是使用DiskFileItemFactory代替。

DiskFileItemFactory使用java.io

中的Gabage收集器清除临时文件
  

文件清理跟踪器:   跟踪等待删除的文件,并在关联时删除它们   标记对象由垃圾收集器回收。

即便如此,我还是要删除旧文件,因为文件清理跟踪器 只是删除被跟踪的临时文件,没有跟踪旧的临时文件,所以它从未被GC删除过。

谢谢亚历克斯,我只是想通了,因为你的答案。 :)

答案 1 :(得分:0)

这不是JBoss。当你使用

FileItemFactory factory = new DiskFileItemFactory();

指示应用程序将文件存储在磁盘上。

您可以使用DefaultItemFactory代替

  

...创建FileItem实例,这些实例将其内容保存在内存中,较小的项目或磁盘上的临时文件中,以用于较大的项目。内容将存储在磁盘上的大小阈值是可配置的,就像创建临时文件的目录一样。