这是我对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,如:
... upload_d77 ced_00000089.tmp
upload_d77 ... ced_00000094.tmp
... 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有没有办法禁用文件创建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();
答案 0 :(得分:1)
我尝试使用DefaultItemFactory
但不推荐使用此类,而是使用DiskFileItemFactory
代替。
DiskFileItemFactory
使用java.io
文件清理跟踪器: 跟踪等待删除的文件,并在关联时删除它们 标记对象由垃圾收集器回收。
即便如此,我还是要删除旧文件,因为文件清理跟踪器 只是删除被跟踪的临时文件,没有跟踪旧的临时文件,所以它从未被GC删除过。
谢谢亚历克斯,我只是想通了,因为你的答案。 :)
答案 1 :(得分:0)
这不是JBoss。当你使用
FileItemFactory factory = new DiskFileItemFactory();
指示应用程序将文件存储在磁盘上。
您可以使用DefaultItemFactory代替
...创建FileItem实例,这些实例将其内容保存在内存中,较小的项目或磁盘上的临时文件中,以用于较大的项目。内容将存储在磁盘上的大小阈值是可配置的,就像创建临时文件的目录一样。