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。これは正しくないです。ファイル アップロード リスナー メソッド (または を使用している場合は送信ボタン) で、アップロードされたファイル コンテンツをすぐに取得する必要があります。より恒久的な場所に保管してください。たとえば、ローカル ディスク ファイル システム、またはデータベース、あるいはBean プロパティとしての場合もあります。次に、ローカル ディスク ファイル システムのファイル名、またはデータベースの PK などを代わりに渡し、ファイルをダウンロードして戻すためのハンドルを取得します。<p:fileUpload handleFileUpload><p:fileUpload mode="simple">byte[]byte[]

Serializable要約すると、バッキング Bean にプロパティが完全にないことを確認するだけでUploadedFile、この問題は解消されます。

于 2013-08-25T01:50:10.537 に答える
1

コードがなければ、最初に頭に浮かぶのはスレッドを同期することです。これにより、ボタン アクションはアップロード プロセスが完了するまで待機します。

編集:あなたがそれを説明している方法から、あなたのアクションは明らかにあまりにも早く呼び出されているため、ファイルはまだ適切に書き込まれていません.

これを回避する 1 つの方法は、ファイルが存在するかどうかを確認することです。

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