在 java 网络应用程序的单独线程中上传文件

Upload a file in a separate thread in a java webapp

我需要制作一个用户可以上传大文件 (>200Mo) 的表单。我想在单独的线程中启动上传,以便用户可以启动 3-4 次上传,然后再做其他事情。我的问题是生成的 .tmp 文件在我 运行 辅助线程时被删除。 我使用 Struts2.

struts2 给我什么:

private String uploadContentType;
private String uploadFileName;
private File upload;

我使用其构造函数将这些信息传输到我的线程

MyThread thread=new MyThread (sourceName, uploadFileName, upload, user, database);
thread.start();

在运行()方法中:

System.out.println("Src File name: " + myFile);
System.out.println("Dst File name: " + myFileFileName);

File destFile  =new File(UPLOAD_DIRECTORY, myFileFileName);
FileUtils.copyFile(myFile, destFile);

错误:

Src Filename:
C:\***myeclipsepath***\upload_1949ed75_1002_4ccf_b198_
25faff66563a_00000003.tmp
Dst File name: books.xml
java.io.FileNotFoundException:    
C:\***myeclipsepath***\upload_1949ed75_1002_4ccf_b198_
25faff66563a_00000003.tmp  (Le fichier spécifié est introuvable)
   at java.io.FileInputStream.open0(Native Method)
   at java.io.FileInputStream.open(Unknown Source)
   at java.io.FileInputStream.<init>(Unknown Source)
   at org.apache.commons.io.FileUtils.doCopyFile(FileUtils.java:1068)
   at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:1021)
   at org.apache.commons.io.FileUtils.copyFile(FileUtils.java:968)
   at bo.threads.MyThread .run(MyThread .java:68)

当我逐步调试时,我看到调用 thread.start() 时 .tmp 文件消失了。

那么我怎样才能在主线程以外的其他线程上上传文件呢?

运行 WebApp 中的多个线程基本上从来不需要,而且几乎总是一个坏主意。

您可能不知道您可以 upload multiple files concurrently。您还可以调整配置设置以允许大小超过默认阈值的文件(每个文件和每个请求)。

要完成让用户在开始上传后执行其他操作的要求,唯一剩下的事情可以通过以下任一方式实现:

  1. 在新选项卡中打开上传页面,然后 运行 标准提交(用户然后手动更改上一个选项卡)
  2. 使用 target="_blank" 在新选项卡中打开上传操作(用户然后手动更改上一个选项卡)
  3. 通过 AJAX 上传(但如果文件太大,您可能会遇到限制和问题)。

我会选择解决方案 n.2。


编辑

Thank you for your advice, it should work but how can I close automatically the tab in my action ?

有很多种方式,比如你可以return一个JSP,由以下内容组成:

<script>
    window.close();
</script>

但是请考虑使用更具描述性的非自动关闭页面或(如果您关闭选项卡)使用来自 other 选项卡(那将是完美的,那将是一个全新的问题,因此请先尝试完成此工作)。