[解決済み] OKHTTPからバイナリファイルをダウンロードする
2023-06-23 21:35:34
質問
アンドロイドアプリケーションで、ネットワークにOKHTTPクライアントを使用しています。
これは の例は、バイナリファイルをアップロードする方法を示しています。OKHTTPクライアントでバイナリファイルをダウンロードする際の入力ストリームを取得する方法を知りたいのですが。
以下は、例のリストです。
public class InputStreamRequestBody extends RequestBody {
private InputStream inputStream;
private MediaType mediaType;
public static RequestBody create(final MediaType mediaType,
final InputStream inputStream) {
return new InputStreamRequestBody(inputStream, mediaType);
}
private InputStreamRequestBody(InputStream inputStream, MediaType mediaType) {
this.inputStream = inputStream;
this.mediaType = mediaType;
}
@Override
public MediaType contentType() {
return mediaType;
}
@Override
public long contentLength() {
try {
return inputStream.available();
} catch (IOException e) {
return 0;
}
}
@Override
public void writeTo(BufferedSink sink) throws IOException {
Source source = null;
try {
source = Okio.source(inputStream);
sink.writeAll(source);
} finally {
Util.closeQuietly(source);
}
}
}
現在の単純なgetリクエストのコードは
OkHttpClient client = new OkHttpClient();
request = new Request.Builder().url("URL string here")
.addHeader("X-CSRFToken", csrftoken)
.addHeader("Content-Type", "application/json")
.build();
response = getClient().newCall(request).execute();
では、どのようにしてレスポンスを
InputStream
. のレスポンスと同じようなものです。
Apache HTTP Client
に対してこのように
OkHttp
のようなレスポンスになります。
InputStream is = response.getEntity().getContent();
エディテージ
以下、回答受付中。 私の修正したコードです。
request = new Request.Builder().url(urlString).build();
response = getClient().newCall(request).execute();
InputStream is = response.body().byteStream();
BufferedInputStream input = new BufferedInputStream(is);
OutputStream output = new FileOutputStream(file);
byte[] data = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
output.write(data, 0, count);
}
output.flush();
output.close();
input.close();
どのように解決するのですか?
OKHTTPからのByteStreamの取得
のドキュメントを掘り返してみました。 OkHttp こちらへどうぞ
この方法を使用します。
response.body().byteStream() は、InputStream を返します。
そのため、BufferedReader や他の代替手段を使用することができます。
OkHttpClient client = new OkHttpClient();
request = new Request.Builder().url("URL string here")
.addHeader("X-CSRFToken", csrftoken)
.addHeader("Content-Type", "application/json")
.build();
response = getClient().newCall(request).execute();
InputStream in = response.body().byteStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
String result, line = reader.readLine();
result = line;
while((line = reader.readLine()) != null) {
result += line;
}
System.out.println(result);
response.body().close();
関連
-
[解決済み] Androidでアクティビティ起動時にEditTextにフォーカスが当たらないようにする方法
-
[解決済み] APKファイルからソースコードを取得する方法はありますか?
-
[解決済み] Androidでファイルをダウンロードし、ProgressDialogで進捗を表示する。
-
[解決済み] ストリームからのバイト配列の作成
-
[解決済み] AndroidにおけるViewPager2の適切な実装
-
[解決済み] CardView layout_width="match_parent "が親のRecyclerViewの幅と一致しない。
-
[解決済み] Androidのadb logcatでTAG名で特定のメッセージを除外する方法は?
-
[解決済み] Android: ランドスケープモード用の代替レイアウト xml
-
[解決済み] 非ActivityクラスでContextを取得する [重複].
-
[解決済み] キャンバスに複数行のテキストを描画する
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] SDカードからファイルを削除する方法を教えてください。
-
[解決済み] ArrayAdapter<myClass> の使用方法
-
[解決済み] Android Debug Bridgeでアプリケーションのインストール時にINSTALL_FAILED_VERSION_DOWNGRADEを無視する方法はありますか?
-
[解決済み] CardView layout_width="match_parent "が親のRecyclerViewの幅と一致しない。
-
[解決済み] EditTextをReadOnlyにする
-
[解決済み] edittextのテキストがメールアドレスかどうかを確認するには?
-
[解決済み] AsyncTaskLoaderとAsyncTaskの比較
-
[解決済み] google-services.jsonって実際何してるの?
-
[解決済み] 実行に失敗しました app:processDebugResources Android Studio
-
[解決済み] 文字列リソースにHTML?