2012-06-09 4 views
26

Я пытаюсь загрузить файл PDF с помощью HttpClient. Я могу получить файл, но я не уверен, как преобразовать байты в PDF-файл и сохранить его где-то в системе.Как сохранить файл, загруженный с помощью HttpClient в определенную папку

У меня есть следующий код, как его сохранить как 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; 
     } 

ответ

33
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(); 

EDIT:

вы также можете использовать 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(); 
+6

HttpClient оптимизирует операции чтения внутри. Нет необходимости использовать другой уровень буферизации – oleg

+0

Я не мог писать прямо в этот путь к файлу, мне пришлось использовать 'File file = new File (context.getExternalFilesDir (Environment.DIRECTORY_DOWNLOADS)," filename.jpg ");' для запись на внешнее хранилище, чтобы другие приложения могли видеть мое приложение. – Aaron

1

Открыть FileOutputStream и сохранить байты из inputStream к нему.

+0

Что меня смущает то, что у вас есть FileOutputStream уже открыты в методе downloadAndSaveToFile, но когда я создаю объект файла с полным путем, я получаю «Файл не существует» ошибка ... Покажет us, который бы взял этот файл, который был загружен и сохранил его в определенной папке? –

+0

Прошу прощения, у меня была опечатка на моем пути. Как оказалось, я могу указать файл-объект с полным желаемым путем, когда путь - путь VALID. :-) –

21

Вот простое решение с использованием 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() отлично подходит для обработки буферизации. Однако это решение не очень масштабируемым:

  • вы не можете указать имя целевого файла и каталог
  • вы можете захотеть хранить файлы другим способом, например, в базе данных. В этом случае файлы не нужны.

Гораздо более масштабируемое решение включает в себя две функции:

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(); 
} 
+0

Будет ли это передавать файл или хранить весь файл в памяти, а затем сохранять на диск? –

26

Просто для записи там лучше (проще) способы делать то же

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, если ему это нравится

Request.Get("http://host/stuff").execute().saveContent(myFile); 
+2

Пакет ведьм мне нужно импортировать для 'Request.Get (« http: // host/stuff ») .execute(). SaveContent (myFile)' – badera

+0

В Maven вам нужен артефакт 'org.apache.httpcomponents: fluent- hc' - пакет Java является 'org.apache.http.client.fluent.Request' –