gpt4 book ai didi

java - 如何停止 FileUploadBase 在 JBoss 7 上创建 upload_temp_file

转载 作者:行者123 更新时间:2023-11-30 08:13:56 25 4
gpt4 key购买 nike

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

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

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

文件名由FileUploadBase生成,并且总是加五,例如:

  1. upload_d77...ced_00000089.tmp

  2. upload_d77...ced_00000094.tmp

  3. upload_d77...ced_00000099.tmp

下面遵循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 有什么方法可以禁用文件创建或设置某些参数吗?

下面按照我的代码调用 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();

最佳答案

我尝试使用 DefaultItemFactory 但此类已被弃用,然后我使用 DiskFileItemFactory 代替。

DiskFileItemFactory 使用 java.io 中的 Gabage Collector 清理临时文件

File Cleaning Tracker: Keeps track of files awaiting deletion, and deletes them when an associated marker object is reclaimed by the garbage collector.

即使如此,我也必须执行删除旧文件的工作,因为文件清理跟踪器只需删除被跟踪的临时文件,旧的临时文件未被跟踪,因此它永远不会被 GC 删除。

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

关于java - 如何停止 FileUploadBase 在 JBoss 7 上创建 upload_temp_file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29929521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com