Comment télécharger l'image à l'aide de reste modèle?
J'ai le code suivant:
restTemplate.getForObject("http://img.championat.com/news/big/l/c/ujejn-runi_1439911080563855663.jpg", File.class);
J'ai surtout pris de l'image qui ne nécessite pas d'autorisation et est disponible absolument pour tous.
lors de l'exécution de code suivant, je vois les suivantes stacktrace:
org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class java.io.File] and content type [image/jpeg]
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:108)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:559)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:512)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:243)
at com.terminal.controller.CreateCompanyController.handleFileUpload(CreateCompanyController.java:615)
que dois-je tort?
OriginalL'auteur gstackoverflow | 2015-08-18
Vous devez vous connecter pour publier un commentaire.
Image est un tableau d'octets, de sorte que vous devez utiliser
byte[].class
objet en tant que deuxième argument pourRestTemplate.getForObject
:Pour le faire fonctionner, vous aurez besoin de configurer une
ByteArrayHttpMessageConverter
dans votre application config:J'ai testé cela dans un Printemps de Démarrage du projet et l'image est enregistrée dans un fichier comme prévu.
J'ai compris à partir de @gstackoverflow la question que c'est le but de convertir le corps de la réponse à un objet et à partir de là. Il n'est pas clair si le fichier objet en mémoire qui est acceptable pour son cas d'utilisation. En passant, pouvez-vous préciser sur le soufflage de la pile, je ne suis pas sûr de suivre (autant que je sache les objets doivent toujours être créé sur le tas, seules les références peuvent être locales)
désolé, votre droit, je voulais dire le tas... mais oui, de toute façon... il est préférable d'utiliser des Api en continu lorsque cela est possible, à mon humble avis, pour éviter de garder des trucs de ce genre dans la mémoire à long terme. Depuis, il semble que son but est tout simplement d'enregistrer le fichier distant vers un fichier local, je ne vois pas le besoin d'un intermédiaire
byte[]
?Je suis d'accord, si vous souhaitez gérer des fichiers de grande taille ou de grande circulation, la diffusion en streaming de fichier, c'est le seul moyen. Plus de Printemps exemples: stackoverflow.com/questions/5673260/...
OriginalL'auteur mzc
La
RestTemplate
s'attend à une classe (par exemple, certains représentation en mémoire) pour convertir la réponse du serveur. Par exemple, il peut convertir une réponse comme:dans une classe comme:
En appelant le:
Mais, ce que vous semblez vraiment envie de le faire est de prendre la réponse du serveur et de les lire directement un fichier. Diverses méthodes existent pour obtenir le corps de la réponse de votre requête HTTP en tant que quelque chose comme un
InputStream
que vous pouvez lire de façon progressive, et puis écrire sur unOutputStream
(par exemple, votre fichier).Cette réponse montre comment utiliser
IOUtils.copy()
decommons-io
à faire certains le sale boulot. Mais vous avez besoin pour obtenir un InputStream de votre fichier... Un moyen simple est d'utiliser unHttpURLConnection
. Il y a un tutoriel avec plus d'informations.ResponseEntity<Fichier> responseEntity = restTemplate.getForObject("img.championat.com/news/big/l/c/...", ResponseEntity.class) ne fonctionne pas trop
Oui, mon point est...
RestTemplate
n'est pas le bon outil pour ce travail...Mais pouvez-vous conseiller?
Je l'ai fait... HttpURLConnection + IOUtils
OriginalL'auteur pioto
Si vous avez simplement besoin d'obtenir une image à partir d'une URL, Java est livré avec le javax.imageio.ImageIO classe, qui contient cette signature de la méthode:
exemple d'utilisation:
OriginalL'auteur mancini0