복붙노트

[SPRING] 소켓에서 예기치 않은 EOF 읽기와 함께 파일 정지를 업로드합니다. 예외

SPRING

소켓에서 예기치 않은 EOF 읽기와 함께 파일 정지를 업로드합니다. 예외

언젠가 원격 vps에 파일을 업로드하려고 할 때이 예외가 발생합니다 (업로드 프로세스가 60 % 멈춤).

06-Jan-2016 11:59:36.801 SEVERE [http-nio-54000-exec-9] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [mvc-dispatcher] in context with path [] threw exception [Request processing failed;
nested exception is org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request;
nested exception is org.apache.commons.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. Unexpected EOF read on the socket]
with root cause
 java.io.EOFException: Unexpected EOF read on the socket

서버가 다운 된 것처럼 Chrome에서 연결이 끊어지면 ERR_CONNECTION_ABORTED가 표시됩니다.

내가 이런 식으로 파일을 업로드 봄 mvc

public void save_file(MultipartFile upfile , String path){

        try {

            File fichier = new File( path ) ;
            byte[] bytes = upfile.getBytes();
            BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream( fichier ));
            stream.write(bytes);
            stream.close();
            System.out.println( "You successfully uploaded " + upfile.getOriginalFilename() + "!" );

        } catch (Exception e) {
            System.out.println( "You failed to upload " + upfile.getOriginalFilename() + " => " + e.getMessage() ); ;
        }

}

내 컨트롤러 :

@RequestMapping(value = "/administration/upload", method = RequestMethod.POST)
public String Upload_AO_journal(
        @ModelAttribute  UploadForm uploadForm,
                Model map , HttpServletRequest request, HttpSession session ) throws ParseException, UnsupportedEncodingException {

내 콩

public class UploadForm {

    ...
    public MultipartFile scan;

어떻게이 문제를 해결할 수 있습니까?

해결법

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

    1.스트리밍 해 보셨습니까?

    스트리밍 해 보셨습니까?

    Jsp 코드 :

    제어 장치:

     @RequestMapping(
            value = "url", method = RequestMethod.POST
    )
    public void uploadFile(
            @RequestParam("file") MultipartFile file
    ) throws IOException {
    
     InputStream input = upfile.getInputStream();
     Path path = Paths.get(path);//check path
     OutputStream output = Files.newOutputStream(path);
     IOUtils.copy(in, out); //org.apache.commons.io.IOUtils or you can create IOUtils.copy
    
    }
    

    봄 4.0 및 봄 보안으로 나에게 도움이되는 모든 것.

    둘째, http 연결이 시간 초과인지 확인해야합니다. Chrome은 해당 구성을 지원하지 않습니다. 따라서 firefox를 사용하고 http://morgb.blogspot.com.es/2014/05/firefox-29-and-http-response-timeout.html을 방문하십시오.

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

    2.이 문제는 전체 데이터를 스트리밍 할 때까지 스트림을 닫았 기 때문에 나타납니다.

    이 문제는 전체 데이터를 스트리밍 할 때까지 스트림을 닫았 기 때문에 나타납니다.

    잘못된 방법:

    stream.write(bytes);
    stream.close();
    

    옳은 방법 :

    try (BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(fichier))) 
    {
        stream.write(data);
    }
    

    전체 데이터가 기록 된 후에 스트림을 닫아야합니다.

  3. ==============================

    3.upfile에 대한 getBytes () 메소드에 대해서는 확실하지 않습니다. 더 적합한 접근 방법은 모든 크기 파일을 관리하고 필요할 때 버퍼링하는 InputStream을 사용하는 것입니다. 같은 것 :

    upfile에 대한 getBytes () 메소드에 대해서는 확실하지 않습니다. 더 적합한 접근 방법은 모든 크기 파일을 관리하고 필요할 때 버퍼링하는 InputStream을 사용하는 것입니다. 같은 것 :

    public void save_file(MultipartFile upfile , String path){
    
        try {
            File fichier = new File( path ) ;
            BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream( fichier ));
            InputStream is = upfile.getInputStream();
            byte [] bytes = new byte[1024];
            int sizeRead;
            while ((sizeRead = is.read(bytes,0, 1024)) > 0) {
                stream.write(bytes, 0, sizeRead);
            }
            stream.flush();
            stream.close();
            System.out.println( "You successfully uploaded " + upfile.getOriginalFilename() + "!" );
    
        } catch (Exception e) {
            System.out.println( "You failed to upload " + upfile.getOriginalFilename() + " => " + e.getMessage() ); ;
        }
    
    }
    
  4. ==============================

    4.비슷한 문제가있어서 문제는 멀티 파트 양식 POST 요청을 사용하여 파일을 업로드 할 때입니다. MIME에 관해 읽을 수 있습니다.

    비슷한 문제가있어서 문제는 멀티 파트 양식 POST 요청을 사용하여 파일을 업로드 할 때입니다. MIME에 관해 읽을 수 있습니다.

    MIME-Version: 1.0
    Content-Type: multipart/mixed; boundary=frontier
    
    This is a message with multiple parts in MIME format.
    --frontier
    Content-Type: text/plain
    
    This is the body of the message.
    --frontier
    Content-Type: application/octet-stream
    Content-Transfer-Encoding: base64
    
    PGh0bWw+CiAgPGhlYWQ+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPHA+VGhpcyBpcyB0aGUg
    Ym9keSBvZiB0aGUgbWVzc2FnZS48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==
    --frontier--
    

    기본적으로 내가 가진 요청은 메타 정보 부분, 텍스트 부분 및 실제 파일이 base64라고 믿어서 인코딩되어 있다는 것입니다. 이 부분들은 각각 경계로 나뉘어져 있습니다. 이 경계를 설정하지 않으면 (예 : "프론티어"라는 위의 예에서) 서버가 파일 읽기를 시작하지만 EOF에 도달 할 때까지 끝나는 위치를 모르고 필요하지 않은 것으로 예상하지 못한 EOF에 대한 오류를 반환합니다 경계.

    당신의 코드에 문제가 있다면 ByteOutputStream에 파일을 쓰는 것입니다. 이것은 서버에서 사용자에게 파일을 반환 할 때 적합합니다. 서버는 표준 사전 정의 된 형식으로이 Multipart 요청을 기다리고 있습니다. 이 요청 양식 작성 및 경계 설정을 수행하는 Apache Commons HttpClient 라이브러리를 사용하십시오. Maven을 사용한다면이 링크를 클릭하십시오.

    File f = new File("/path/fileToUpload.txt");
    PostMethod filePost = new PostMethod("http://host/some_path");
    Part[] parts = {
      new StringPart("param_name", "value"),
      new FilePart(f.getName(), f)
    };
    filePost.setRequestEntity(
      new MultipartRequestEntity(parts, filePost.getParams())
      );
    HttpClient client = new HttpClient();
    int status = client.executeMethod(filePost);
    

    면책 조항 : 코드는 멀티 플렉스 요청에 대한 Apache 웹 사이트의 예가 아닙니다.

  5. from https://stackoverflow.com/questions/34634455/upload-file-stop-with-unexpected-eof-read-on-the-socket-exception by cc-by-sa and MIT license