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;
}
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();
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);
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:
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();
}
Ouvrez une FileOutputStream
et sauvegardez les octets de inputStream
.
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);
}
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();
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");