[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.스트리밍 해 보셨습니까?
스트리밍 해 보셨습니까?
Jsp 코드 :
-
==============================
2.이 문제는 전체 데이터를 스트리밍 할 때까지 스트림을 닫았 기 때문에 나타납니다.
이 문제는 전체 데이터를 스트리밍 할 때까지 스트림을 닫았 기 때문에 나타납니다.
잘못된 방법:
stream.write(bytes); stream.close();
옳은 방법 :
try (BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(fichier))) { stream.write(data); }
전체 데이터가 기록 된 후에 스트림을 닫아야합니다.
-
==============================
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.비슷한 문제가있어서 문제는 멀티 파트 양식 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 웹 사이트의 예가 아닙니다.
from https://stackoverflow.com/questions/34634455/upload-file-stop-with-unexpected-eof-read-on-the-socket-exception by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring / MVC 3.0 앱에서 타일이있는 일반적인 오류 페이지 템플릿을 어떻게 만들 수 있습니까? (0) | 2019.04.03 |
---|---|
[SPRING] 파일 시스템에서 파일에 대한 property-placeholder 사용법 (0) | 2019.04.03 |
[SPRING] MyClass.class 매개 변수를 필요로하는 factory 메소드 용 Spring Bean 삽입 방법 (0) | 2019.04.03 |
[SPRING] MockMVC를 통한 폼 포스트 테스트 (0) | 2019.04.03 |
[SPRING] java.lang.ClassNotFoundException : 스프링과 하이버 레이트를 통합하면서 org.hibernate.cache.CacheProvider 예외 (0) | 2019.04.03 |