C'est YuruFuwaFox. J'étudie Java. Comment puis-je afficher l'image avec le contrôleur REST de Spring cette fois? Je l'ai donc implémentée en recherchant diverses choses, alors j'aimerais partager la méthode avec un mémo!
Cet article s'adresse à un débutant en Java. Je ne suis pas pour les gens qui sont des ingénieurs de Tsuyotsuyo, alors j'apprécierais votre faveur. Si vous le lisez encore, merci! (Souligner ce qui ne va pas est également le bienvenu!)
Tout d'abord, qu'est-ce que RESTController? Je vais expliquer à partir de. RESTController est destiné à ce que l'on appelle l'API qui renvoie JSON ou xml comme valeur de retour. Un contrôleur normal renvoie essentiellement une vue, mais c'est comme ne transmettre que les données! En d'autres termes, si vous souhaitez renvoyer une vue, il semble que vous puissiez simplement passer l'image à la vue et l'afficher d'une manière ou d'une autre, mais que devez-vous faire avec un contrôleur REST qui renvoie JSON ou xml?
Les images peuvent être affichées en les passant sous forme de données binaires. Par conséquent, j'ai décidé d'afficher l'image en la passant au format binaire.
J'afficherai l'image sur le navigateur. Par conséquent, j'utiliserai HttpEntity pour mettre une image dans le corps de la réponse.
showImgService.java
public HttpEntity<[byte]> showImg(String image) throws IOException{
//Obtenir une image
Resource resource = resourceLoader.getResource("File:" + staticPath + imgPath);
//Pour l'acquisition de format d'image
String format;
//Pour stocker des données d'octet
ByteArrayOutputStream bout;
//Image en données d'octet
try (InputStream img = resource.getInputStream()) {
format = URLConnection.guessContentTypeFromStream(img);
bout = new ByteArrayOutputStream();
int c;
while ((c = img.read()) != -1) {
bout.write(c);
}
}
//Extraire les données d'octet
byte[] bytes = bout.toByteArray();
//Créer un en-tête
HttpHeaders headers = new HttpHeaders();
//Stocker les informations de contenu dans l'en-tête
headers.setContentType(MediaType.valueOf(format));
headers.setContentLength(bytes.length);
//Passez les données d'octet et l'en-tête à HttpEntity et retournez
return new HttpEntity<>(bytes, headers);
}
C'est vraiment un mémo, donc c'est un sentiment difficile. Vous pouvez en fait convertir les données d'octets d'image en une seule ligne en utilisant IOUtils, mais cette fois j'ai oublié, donc ça ressemble à ceci. J'espère que cela aide quelqu'un!
Recommended Posts