web-dev-qa-db-fra.com

Comment enregistrer un fichier téléchargé avec HttpClient dans un dossier spécifique

J'essaie de télécharger un fichier PDF avec HttpClient. Je peux obtenir le fichier mais je ne sais pas comment convertir les octets en a PDF et les stocker quelque part sur le système.

J'ai le code suivant, comment puis-je le stocker au format 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();

MODIFIER:

vous pouvez également utiliser BufferedOutputStream et BufferedInputStream pour un téléchargement plus rapide:

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();
38
Eng.Fouad

Pour mémoire, il existe de meilleures façons (plus faciles) de faire de même.

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);
        }
    }
}

Ou avec l'API fluide si on l'aime mieux

Request.Get("http://Host/stuff").execute().saveContent(myFile);
34
oleg

Voici une solution simple utilisant 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() est formidable car il gère la mise en mémoire tampon. Cependant cette solution n'est pas très évolutive:

  • vous ne pouvez pas spécifier le nom du fichier cible et le répertoire
  • vous souhaiterez peut-être stocker les fichiers d’une manière différente, par exemple. dans une base de données. Les fichiers ne sont pas nécessaires dans ce scénario.

Une solution beaucoup plus évolutive implique deux fonctions:

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

Et une méthode d'assistance:

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

Ouvrez une FileOutputStream et sauvegardez les octets de inputStream.

1
Jeffrey Zhao

Si vous utilisez Java 7+, vous pouvez utiliser les options natives Files.copy (options InputStream in, Path target, CopyOption ...) , par exemple:

HttpEntity entity = response.getEntity();

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

Utilisation de la dépendance org.Apache.httpcomponents:fluent-hc:

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

La demande provient de org.Apache.http.client.fluent.Request.

Dans mon cas, j'avais besoin d'un flux, c'est tout aussi simple:

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

Vous pouvez également utiliser l'API client http Apache http

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