2016-06-16 5 views
0

マルチパートフォームを使用してサーバーにファイルをアップロードしようとしています。 API 23以降、AndroidはApache HTTPライブラリを非推奨にしました。Androidマルチパートフォームマシュマロのファイルアップロード

私はそうのような私のファイルのアップロードを行うためにOkHttp使用に切り替え:

 RequestBody requestBody = new MultipartBody.Builder() 
       .setType(MultipartBody.FORM) 
       .addFormDataPart(name, fileName, requestBodyPart) 
       .build(); 

     Request request = new Request.Builder() 
       .url(url) 
       .post(requestBody) 
       .build(); 

そしてrequestBodyPartは次のとおりです。OkHttpはその素晴らしいではありませんようにそれが来るとき

 requestBodyPart = new RequestBody() { 
      @Override 
      public MediaType contentType() { 
       return MediaType.parse(contentType); 
      } 

      @Override 
      public void writeTo(BufferedSink sink) throws IOException { 
       try { 
        if (sink.writeAll(Okio.source(inputStream)) == 0) { 
         throw new IOException("Empty File!"); 
        } 
       } finally { 
        MiscUtils.closeCloseable(inputStream); 
       } 
      } 
     }; 

はしかし、それはそうですファイルのアップロード。多くのタイムアウトと抽象化(ソースとシンク)のいくつかのレイヤーを作成しているようで、このAsyncTimeoutはファイルデータがまだソケット上に書き込まれている間に発生します。

API 23以降で動作するAndroidからのマルチパートファイルアップロードを行うための推奨事項はありますか?私はHTTPのレガシーライブラリを含めることができますが、削除されて以来、私はそれをしたくないと思っています。または、私はOkHttpのパフォーマンスを向上させる方法がありますか?

答えて

0

これはあなたの応答のための

String name = ... 
File file = ... 
MediaType mediaType = MediaType.parse(...) 
OkHttpClient httpClient = ... 
Request request = new Request.Builder() 
     .url(url) 
     .post(new MultipartBuilder().type(MultipartBuilder.FORM) 
            .addFormDataPart(name, 
                file.getName(), 
                RequestBody.create(mediaType, file)) 
            .build()) 
     .build(); 
try { 
    Response response = httpClient.newCall(request).execute(); 
} catch (IOException e) { 
    // handle error 
} 
+0

おかげで動作するはずです。はい、私はまさにそれを使用しています。問題は、わずかに大きいファイルや、ファイルの書き込み中にタイムアウトが発生する低速ネットワークではパフォーマンスが低下することです。 – dg428

+0

タイムアウトは、データがソケットに書き込まれるまで発生してはなりません。 'OkHttpClient httpClient = new OkHttpClient();を使ってタイムアウトを設定できます。 httpClient.setConnectTimeout(30、TimeUnit.SECONDS); httpClient.setReadTimeout(30、TimeUnit.SECONDS); ' –

+0

私は実際には3分以上に設定しています。何が起こるのは、大きなファイルの最後のバイトがAsyncTimeoutが起動するソケットにまだ転送されていないことです(基底のソケットがデータの一部をバッファしているためです)。 AsyncTimeoutはソケット上では動作しませんが、sleep()でアプリケーション上で動作し、応答がサーバから返ってくる前に起動します。ソケット自体はタイムアウトしていません。 – dg428

関連する問題