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のパフォーマンスを向上させる方法がありますか?
おかげで動作するはずです。はい、私はまさにそれを使用しています。問題は、わずかに大きいファイルや、ファイルの書き込み中にタイムアウトが発生する低速ネットワークではパフォーマンスが低下することです。 – dg428
タイムアウトは、データがソケットに書き込まれるまで発生してはなりません。 'OkHttpClient httpClient = new OkHttpClient();を使ってタイムアウトを設定できます。 httpClient.setConnectTimeout(30、TimeUnit.SECONDS); httpClient.setReadTimeout(30、TimeUnit.SECONDS); ' –
私は実際には3分以上に設定しています。何が起こるのは、大きなファイルの最後のバイトがAsyncTimeoutが起動するソケットにまだ転送されていないことです(基底のソケットがデータの一部をバッファしているためです)。 AsyncTimeoutはソケット上では動作しませんが、sleep()でアプリケーション上で動作し、応答がサーバから返ってくる前に起動します。ソケット自体はタイムアウトしていません。 – dg428