5

我正在构建 Java 应用程序(Spring & JSF & PrimeFaces)。我将文件上传到服务器,但是,如果在文件上传结束后立即单击“下一步”按钮,我会收到此错误:

Aug 24, 2013 8:12:34 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/codekata] threw exception [Request processing failed; nested exception is org.springframework.webflow.execution.repository.FlowExecutionRestorationFailureException: A problem occurred restoring the flow execution with key 'e1s3'] with root cause
java.io.FileNotFoundException: C:\Users\Luke\AppData\Local\Temp\upload__6f71235a_140b1bdd246__8000_00000011.tmp (The system cannot find the file specified)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:138)
    at org.apache.commons.fileupload.disk.DiskFileItem.readObject(DiskFileItem.java:709)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:1004)
    at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1891)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1796)
     java.lang.Thread.run(Thread.java:722)

如果我等待几秒钟,一切正常。我假设上传文件需要有时间将自己复制到临时文件夹,有没有人知道如何解决这个问题。我使用Tomcat 7。

这是我的下载方法:

public StreamedContent getDownloadFile()
    {
        InputStream inputStream = new ByteArrayInputStream(selectedBook.getBookText().getText().getBytes());
        return new DefaultStreamedContent(inputStream, "text/plain", selectedBook.getTitle() + ".txt", BookBean.encoding);
    }

谢谢,卢克。

4

2 回答 2

10

根据堆栈跟踪,您似乎将UploadedFile实例存储为一个单独的类的属性Serializable。这个不对。您应该立即<p:fileUpload handleFileUpload>文件上传侦听器方法中获取上传的文件内容(或者如果您使用的是提交按钮<p:fileUpload mode="simple">)。将其存放在更永久的位置。例如,本地磁盘文件系统或数据库,甚至可能作为byte[]bean 属性。然后通过本地磁盘文件系统文件名,或数据库PK,或byte[]周围代替,以便有一个句柄将文件下载回来。

总结一下,只要确保你的Serializablebacking bean 完全没有UploadedFile属性,这个问题就会消失。

于 2013-08-25T01:50:10.537 回答
1

如果没有任何代码,首先想到的是同步线程,这样您的按钮操作将等待上传过程完成。

编辑:从您描述它的方式来看,您的操作显然被调用得太早了,因此该文件尚未正确写入。

解决此问题的一种方法是检查文件是否存在:

File file = new File(<path_to_tmp_file>);
  if(file.exists()){
    //Download file
  }
于 2013-08-24T19:32:01.537 回答