복붙노트

[SPRING] 임시 파일에 대한 파일을 찾을 수 없음

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);
    }

감사, 루크.

해결법

  1. ==============================

    1.스택 추적을 기반으로, UploadedFile 인스턴스를 자체적으로 Serializable 클래스의 속성으로 저장하는 것처럼 보입니다. 이것은 옳지 않다.

    파일 업로드 리스너 메소드 (또는

    를 사용하는 경우 제출 버튼)에서 즉시 업로드 된 파일 내용을 가져와야합니다. 더 영구적 인 장소에 보관하십시오. 예 : 로컬 디스크 파일 시스템 또는 데이터베이스 또는 byte [] bean 등록 정보 일 수 있습니다. 그런 다음 로컬 디스크 파일 시스템 파일 이름이나 데이터베이스 PK 또는 바이트 []를 전달하여 파일을 다시 다운로드 할 핸들을 확보하십시오.

    스택 추적을 기반으로, UploadedFile 인스턴스를 자체적으로 Serializable 클래스의 속성으로 저장하는 것처럼 보입니다. 이것은 옳지 않다.

    파일 업로드 리스너 메소드 (또는

    를 사용하는 경우 제출 버튼)에서 즉시 업로드 된 파일 내용을 가져와야합니다. 더 영구적 인 장소에 보관하십시오. 예 : 로컬 디스크 파일 시스템 또는 데이터베이스 또는 byte [] bean 등록 정보 일 수 있습니다. 그런 다음 로컬 디스크 파일 시스템 파일 이름이나 데이터베이스 PK 또는 바이트 []를 전달하여 파일을 다시 다운로드 할 핸들을 확보하십시오.

    요약하면, Serializable backing 빈은 UploadedFile 프로퍼티가 완전히 없어지고이 문제는 사라질 것이다.

  2. ==============================

    2.코드가 없으면 가장 먼저 염두에 두어야 할 것은 스레드를 동기화하여 단추 작업이 업로드 프로세스가 완료 될 때까지 기다리는 것입니다.

    코드가 없으면 가장 먼저 염두에 두어야 할 것은 스레드를 동기화하여 단추 작업이 업로드 프로세스가 완료 될 때까지 기다리는 것입니다.

    편집 : 당신이 그것을 설명하는 방식에서, 당신의 행동은 분명히 너무 빨리 호출되고, 그래서 파일이 아직 제대로 작성되지 않았습니다.

    이 문제를 해결할 수있는 한 가지 방법은 파일이 있는지 확인하는 것입니다.

    File file = new File(<path_to_tmp_file>);
      if(file.exists()){
        //Download file
      }
    
  3. from https://stackoverflow.com/questions/18422268/file-not-found-exception-for-temporary-files by cc-by-sa and MIT license