1. ホーム
  2. android

[解決済み] 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();