首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阻止FileUploadBase在JBoss 7上创建upload_temp_file

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

Stack Overflow用户
提问于 2015-04-28 20:42:41
回答 2查看 389关注 0票数 1

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

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

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

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

  1. upload_d77...ced_00000089.tmp
  2. upload_d77...ced_00000094.tmp
  3. upload_d77...ced_00000099.tmp

bellow遵循parseRequest方法的代码,文件是在而循环完成时创建的。

代码语言:javascript
复制
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是否有任何方法禁用文件创建或设置一些参数?

下面是我调用parseRequest的代码

代码语言:javascript
复制
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();
EN

回答 2

Stack Overflow用户

发布于 2015-04-29 15:03:24

我试着使用DefaultItemFactory,但是这个类被废弃了,然后我使用了DiskFileItemFactory

DiskFileItemFactory使用来自java.io的Gabage收集器清理临时文件

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

即使如此,我还是不得不做一个作业来删除旧文件,因为文件清理跟踪器只是删除跟踪的临时文件,而旧的临时文件没有被跟踪,所以它从未被GC删除。

谢谢亚历克斯我才知道是因为你的答案。:)

票数 1
EN

Stack Overflow用户

发布于 2015-04-28 21:15:19

不是JBoss干的。当你使用

代码语言:javascript
复制
FileItemFactory factory = new DiskFileItemFactory();

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

您可以使用DefaultItemFactory代替

...creates FileItem实例,这些实例将其内容保存在内存中、较小的项或磁盘上的临时文件中,或者保存在较大的项中。在磁盘上存储内容的大小阈值是可配置的,创建临时文件的目录也是如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29929521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档