2017-08-09 14 views
0

Androidの携帯電話からJavaサーブレットに動画を送信するためにokhttp3を使用しています。私は複数のファイルを送信すると最初のカップルファイルが送信されますが、いくつかの点で私はこの例外を取得を開始している:ビデオファイルを送信するためにAndroid okhttp3:予想された2030バイトですが受信した2362

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

私のアンドロイドのコードは次のとおりです。受信する

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サーブレットコードファイル:

@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 ----------- ----

サーバーではなくアンドロイドの問題であることが分かりました。私がサーブレットからすべてをコメントすると同じ問題が発生するためです。

答えて

0

通常、バッファがフラッシュされる前にスレッドが終了するため、この種のエラーが発生します。

これを排除するには、close stream /ファイルが正常に終了しているブロックをサーバーに置いているように見えます。 `しかし、私はできません。

は、私は、私はI/Oは、` item.write(storeFile)されたファイルか、サーバで唯一の場所を開いているすべてのストリーム/ファイルを持っていないthis answer ...

+0

を参照してください。これを閉じます。 – develop1

関連する問題