簡體   English   中英

在Java Web應用程序的單獨線程中上傳文件

[英]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();

在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)

當我逐步調試時,我看到當我調用thread.start()時,.tmp文件消失了。

那么,如何在主線程之外的其他線程上上傳文件?

基本上不需要在WebApp中運行多個線程,並且幾乎總是一個壞主意。

您可能不知道可以同時上傳多個文件 您還可以調整配置設置,以允許文件大小大於默認閾值(每個文件和每個請求)。

要滿足您讓用戶開始上傳后再做其他事情的要求,剩下的唯一事情可以通過以下任一方法來實現:

  1. 在新標簽頁中打開上傳頁面,然后運行標准提交(用戶然后手動更改上一個標簽頁)
  2. 使用target="_blank"在新標簽中打開上傳操作(用戶然后手動更改上一個標簽)
  3. 通過AJAX上傳(但尺寸過大,可能會遇到限制和問題)。

我會選擇解決方案n.2。


編輯

感謝您的建議,它應該可以工作,但是我該如何在操作中自動關閉該標簽?

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

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

但是,請考慮使用更具描述性的,非自我關閉的頁面,或者(如果您關閉了該選項卡)使用另一個選項卡中的某種偵聽器來通知用戶該操作的正面(或負面)結果。完美,這將是一個全新的問題,因此請嘗試先完成此工作)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM