在 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。您还可以调整配置设置以允许大小超过默认阈值的文件(每个文件和每个请求)。
要完成让用户在开始上传后执行其他操作的要求,唯一剩下的事情可以通过以下任一方式实现:
- 在新选项卡中打开上传页面,然后 运行 标准提交(用户然后手动更改上一个选项卡)
- 使用
target="_blank"
在新选项卡中打开上传操作(用户然后手动更改上一个选项卡)
- 通过 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 选项卡(那将是完美的,那将是一个全新的问题,因此请先尝试完成此工作)。
我需要制作一个用户可以上传大文件 (>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。您还可以调整配置设置以允许大小超过默认阈值的文件(每个文件和每个请求)。
要完成让用户在开始上传后执行其他操作的要求,唯一剩下的事情可以通过以下任一方式实现:
- 在新选项卡中打开上传页面,然后 运行 标准提交(用户然后手动更改上一个选项卡)
- 使用
target="_blank"
在新选项卡中打开上传操作(用户然后手动更改上一个选项卡) - 通过 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 选项卡(那将是完美的,那将是一个全新的问题,因此请先尝试完成此工作)。