web-dev-qa-db-ja.com

Unexpected EOF read on socket Exception)でファイルのアップロードが停止します

リモート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

およびGoogle 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;

では、この問題をどのように解決できますか?

16
Youssef

ストリーミングを試しましたか?

JSPコード:

<form method="POST" onsubmit="" ACTION="url?${_csrf.parameterName}=${_csrf.token}" ENCTYPE="multipart/form-data">

コントローラ:

 @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

5
ahll

この問題は、ストリームがデータ全体を書き込むまでストリームを閉じるために発生します。

進入禁止:

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

正しい方法:

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

データ全体が書き込まれた後、ストリームを閉じる必要があります。

2
eg04lt3r

アップファイルの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() ); ;
    }

}
1
Mike Murphy

私は同様の問題を抱えていて、問題はマルチパートフォームを使用しているファイルをアップロードするときです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に書き込んでいるということです。これは、サーバーからユーザーにファイルを返すときに適しています。サーバーは、いくつかの標準の事前定義された書式設定でこのマルチパートリクエストを予期しています。 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 Webサイト

1
MichaelDD