4 题: 上传文件停止,并在套接字Exception上读取意外的EOF

在...创建的问题 Mon, Jan 11, 2016 12:00 AM

有时当我尝试在远程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

我在spring 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
  1. 是否所有文件大小都失败,或者小文件成功了吗?您可以共享将请求映射到此方法的特定于Spring的代码吗?
    2016-01-11 21:00:29Z
  2. @ tdimmig有时它失败了,有时它的大小也相同!我更新了我的问题。
    2016-01-11 21:04:59Z
  3. 看看这个答案是否可以帮到你: stackoverflow.com/a/4056187分之18543887
    2016-01-11 21:36:19Z
  4. 醇>
    4个答案                              4 跨度>                         

    你试过流吗?

    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
    2016-01-11 21:59:50Z
    1. 文件的apache api比文件的默认java api更安全吗?
      2016-01-18 12:28:47Z
    2. 我使用它,只是因为它干净且经过测试。我认为它更安全。
      2016-01-18 17:37:20Z
    3. 醇>

    出现此问题是因为您关闭流直到流写入整个数据。

    错误的方式:

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

    正确的方式:

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

    您应该在写完整个数据后关闭您的信息流。

        
    2
    2016-11-03 07:43:10Z
    1. 当然,stream.close()应该放入finally块。
      2016-01-18 17:47:25Z
    2. 醇>

    不确定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() ); ;
        }
    
    }
    
        
    1
    2016-01-14 10:59:26Z
    1. 为什么new byte[1024]?大小将被1024?
      分开
      2016-01-18 11:31:20Z
    2. 你可以使它成为你需要的任何尺寸,1024是1K,通常是最佳性能下载的大小。你试过吗?
      2016-01-18 11:56:10Z
    3. 当我回家时我还会尝试
      2016-01-18 12:26:01Z
    4. 醇>

    我有类似的问题和问题,当你上传文件时,你正在使用Multipart Form POST Request。您可以阅读 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网站

        
    1
    2016-01-15 12:24:24Z
    1. OP是使用浏览器上传的,没有客户端代码?
      2016-01-15 12:27:33Z
    2. 从他的问题我明白他是从Spring客户端上传,因为他说“我在春季mvc上传这样的文件”,这就是为什么我认为他从客户端上传
      2016-01-15 12:30:30Z
    3. 我猜他的意思是“进入”。他正在客户端上使用谷歌浏览器上传,并在服务器端安装了Spring MVC。
      2016-01-15 12:47:19Z
    4. @ MichaelDD是的我使用浏览器
      2016-01-18 11:32:13Z
    5. 哦,我的道歉,我没有正确理解这个问题。从客户端上传时我遇到了同样的问题,所以我认为这也是你的情况
      2016-01-18 12:16:56Z
    6. 醇>
来源放置 这里