Android okhttp3:预计2030字节但收到2362

问题描述:

我使用okhttp3从Android手机发送视频到Java servlet。当我发送多个文件的第一对夫妇的文件发送,但在某些时候,我开始得到此异常:Android okhttp3:预计2030字节但收到2362

java.net.ProtocolException: expected 2030 bytes but received 2362 
at okhttp3.internal.http.Http1xStream$FixedLengthSink.write(Http1xStream.java:283) 

我的Android代码来发送视频文件是:

import android.util.Log; 

import java.io.File; 
import java.io.IOException; 
import java.util.HashMap; 
import java.util.Set; 

import okhttp3.MediaType; 
import okhttp3.MultipartBody; 
import okhttp3.OkHttpClient; 
import okhttp3.Request; 
import okhttp3.RequestBody; 
import okhttp3.Response; 

public class DataTransfer { 
    public static void sendFile(final String method, final String path, final String fileSubType, final HashMap<String, String> hm) { 
     Thread t = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       OkHttpClient client = new OkHttpClient(); 

       MultipartBody.Builder builder = new MultipartBody.Builder().setType(MultipartBody.FORM); 
       builder.addFormDataPart("file", path, RequestBody.create(MediaType.parse(fileSubType), new File(path))); 

       Set<String> set = hm.keySet(); 
       for (String s : set) { 
        builder.addFormDataPart(s,hm.get(s)); 
       } 

       RequestBody request_body = builder.build(); 

       try { 
        Log.e(Constants.TAG, "++++++++++++++++++++++\n\n\nSIZE = " + request_body.contentLength() + "\n\n\n====================================\n"); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       Request request = new Request.Builder() 
         .url(Constants.URL + "/" + method) 
         .post(request_body) 
         .build(); 

       try { 
        Response response = client.newCall(request).execute(); 
        Log.d(Constants.TAG, "+++++++++++++++++++++\n" + response.body().toString() + "==========================================="); 
        if(!response.isSuccessful()){ 
         throw new IOException("Error : "+response); 
        } 
       } catch (IOException e) { 
        Log.d(Constants.TAG, Log.getStackTraceString(e)); 
       } 
      } 
     }); 

     t.start(); 
    } 
} 

的Java servlet代码,即可获得文件:

@RequestMapping(value="/dataTransfer", method = RequestMethod.POST) 
    protected void dataTransfer(HttpServletRequest request, HttpServletResponse response) throws Exception {   
     try { 
      List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); 
      List<File> files = new ArrayList<File>();//Holds all the files that were received 
      HashMap<String, String> map = new HashMap<String, String>(); 
      for (FileItem item : items) { 
       if (item.isFormField()) { 
        // Process regular form field (input type="text|radio|checkbox|etc", select, etc). 
        String fieldName = item.getFieldName(); 
        String fieldValue = item.getString(); 

        map.put(fieldName, fieldValue); 
       } else { 
        // Process form file field (input type="file"). 
        String fileName = FilenameUtils.getName(item.getName());//If the name was not specified set default 

        String filePath = Constants.ORIGINAL_DIRECTORY_PATH + fileName; 
        File storeFile = new File(filePath); 
        item.write(storeFile); 

        files.add(storeFile); 
       } 
      } 

      //Do other stuff to file 
     } catch (FileUploadException e) { 
      throw new ServletException("Cannot parse multipart request.", e); 
     } 
    } 

而在服务器端我收到此错误信息:

org.apache.commons.fileupload.MultipartStream$MalformedStreamException: Stream ended unexpectedly 

这是怎么发生的?我该如何解决它?

-----------------------------编辑于8/10/17 ----------- ----

发现它不是一个服务器,而是一个android问题,因为如果我从servlet注释掉所有内容,就会发生同样的问题。

通常情况下会出现这种错误,因为您的线程在缓冲区刷新之前退出。

你可以通过puttying一个finally代码块来优化关闭流/文件,好像你在服务器中丢失了一个。

this answer ..

+0

我没有任何打开的流/文件中,在我的文件我的服务器的唯一的地方/ O是'item.write(storeFile);'但是我不能关闭这个。 – develop1