web-dev-qa-db-ja.com

HttpClientでダウンロードしたファイルを特定のフォルダーに保存する方法

HttpClientでPDFファイルをダウンロードしようとしています。ファイルを取得することはできますが、バイトをaa PDFとシステムのどこかに保存する

次のコードがあります。PDFとして保存するにはどうすればよいですか?

 public ???? getFile(String url) throws ClientProtocolException, IOException{

            HttpGet httpget = new HttpGet(url);
            HttpResponse response = httpClient.execute(httpget);
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                long len = entity.getContentLength();
                InputStream inputStream = entity.getContent();
                // How do I write it?
            }

            return null;
        }
36
InputStream is = entity.getContent();
String filePath = "sample.txt";
FileOutputStream fos = new FileOutputStream(new File(filePath));
int inByte;
while((inByte = is.read()) != -1)
     fos.write(inByte);
is.close();
fos.close();

編集:

BufferedOutputStream および BufferedInputStream を使用してダウンロードを高速化することもできます。

BufferedInputStream bis = new BufferedInputStream(entity.getContent());
String filePath = "sample.txt";
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(filePath)));
int inByte;
while((inByte = bis.read()) != -1) bos.write(inByte);
bis.close();
bos.close();
40
Eng.Fouad

記録のために、同じことをするより良い(簡単な)方法があります

File myFile = new File("mystuff.bin");

CloseableHttpClient client = HttpClients.createDefault();
try (CloseableHttpResponse response = client.execute(new HttpGet("http://Host/stuff"))) {
    HttpEntity entity = response.getEntity();
    if (entity != null) {
        try (FileOutputStream outstream = new FileOutputStream(myFile)) {
            entity.writeTo(outstream);
        }
    }
}

または、流APIなAPIを使用した方が良い場合

Request.Get("http://Host/stuff").execute().saveContent(myFile);
35
ok2c

IOUtils.copy() を使用した簡単なソリューションを次に示します。

_File targetFile = new File("foo.pdf");

if (entity != null) {
    InputStream inputStream = entity.getContent();
    OutputStream outputStream = new FileOutputStream(targetFile);
    IOUtils.copy(inputStream, outputStream);
    outputStream.close();
}

return targetFile;
_

IOUtils.copy()は、バッファリングを処理するため素晴らしいです。ただし、このソリューションはあまりスケーラブルではありません。

  • ターゲットファイル名とディレクトリを指定することはできません
  • 別の方法でファイルを保存したい場合があります。データベース内。このシナリオではファイルは必要ありません。

よりスケーラブルなソリューションには、2つの機能が含まれます。

_public void downloadFile(String url, OutputStream target) throws ClientProtocolException, IOException{
    //...
    if (entity != null) {
    //...
        InputStream inputStream = entity.getContent();
        IOUtils.copy(inputStream, target);
    }
}
_

そしてヘルパーメソッド:

_public void downloadAndSaveToFile(String url, File targetFile) {
    OutputStream outputStream = new FileOutputStream(targetFile);
    downloadFile(url, outputStream);
    outputStream.close();
}
_
22

Java 7+を使用している場合、ネイティブ Files.copy(InputStream in、Path target、CopyOption ... options) を使用できます。例:

HttpEntity entity = response.getEntity();

try (InputStream inputStream = entity.getContent()) {
    Files.copy(inputStream, Paths.get(filePathString), StandardCopyOption.REPLACE_EXISTING);
}
2
dlauzon

依存関係の使用org.Apache.httpcomponents:fluent-hc

Request.Get(url).execute().saveContent(file);

リクエストはorg.Apache.http.client.fluent.Request

私の場合、ストリームが必要でしたが、これも同様に簡単です:

inputStream = Request.Get(url).execute().returnContent().asStream();
1
Aleris

FileOutputStreamを開き、inputStreamからのバイトを保存します。

1
Jeffrey Zhao

Apache HTTPクライアントFluent APIを使用することもできます

Executor executor = Executor.newInstance().auth(new HttpHost(Host), "user", "password"); 
executor.execute(Request.Get(url.toURI()).connectTimeout(1000)).saveContent("C:/temp/somefile");
0
Anand