在java webapp中的单独线程中上载文件

时间:2015-08-03 08:40:24

标签: java multithreading web-applications struts2 upload

我需要制作一个用户可以上传大文件(> 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();

在run()方法中:

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)

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

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

1 个答案:

答案 0 :(得分:2)

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

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

在开始上传后,唯一可以实现让用户做其他事情的要求可以通过以下方式实现:

  1. 在新标签页中打开上传页面,然后运行标准提交(用户然后手动更改上一个标签页)
  2. 使用target="_blank"在新标签页中打开上传操作(用户然后手动更改上一个标签页)
  3. 通过AJAX上传(但是你可能会遇到巨大的限制和问题)。
  4. 我选择解决方案n.2。

    修改

      

    感谢您的建议,它应该有效但如何在我的操作中自动关闭标签?

    有很多方法,例如,您可以返回包含以下内容的JSP:

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

    但是考虑通过更具描述性,非自我关闭的页面通知用户操作的正面(或负面)结果,或者(如果你关闭标签)通过中的某种倾听者告知用户其他标签(这将是完美的,这将是一个全新的问题,所以尝试以前的工作)。