[JAVA] Implémenter l'entrée / sortie d'image avec Spring MVC

Voir ici pour télécharger des images

Cliquez ici pour télécharger des images (https://qiita.com/shibafu/items/16dbf776bd81a40450fd)

Un petit détour

Si vous ne connaissez pas Spring et votre composition, je pense que c'est un fouillis, alors je vais vous expliquer un peu mon projet.

アーキテクチャ.png

Il a une telle structure. Le ** contrôleur ** est le premier accès à ce serveur. Chacune des méthodes qu'elle contient accepte l'accès.

** Service ** est l'endroit où la description de traitement réelle du programme est stockée. Jetons un coup d'œil au contenu du service. Architecture.png

** L'interface ** est le point d'entrée des contrôleurs et autres programmes Java dans ce service. Et cela est implémenté dans une classe appelée hogehoge ** Impl **. (Impl signifie "mise en œuvre".)

Pourquoi est-il nécessaire de séparer la description du traitement et l'entrée? Voyons la description qui appelle réellement le service

アーキテクチャ.png

Premier coup d'oeil au programme à droite Il est annoté ** @ Service **. Cela signifie qu'il s'agit d'une déclaration de "classe de service" et en même temps ** d'enregistrer une instance dans le conteneur DI **. ** Le conteneur DI ** est une fonction de Spring Framework, qui rend les programmes Java ** faiblement couplés **. Spring Framework contrôle la création et la publication des instances qui entrent dans le conteneur DI.

Ce qui me satisfait, c'est qu'il peut être compilé même si le traitement n'est pas implémenté. Jetons un coup d'œil à l'appel de service sur la gauche.

** Déclaration d'interface ** et Il est annoté ** @ Autowired **.

@Autowired est une commande pour "créer un conteneur DI enregistré, cette instance de type" (ne peut pas être utilisé lorsque deux ou plusieurs beans du même type sont enregistrés).

Ce à quoi vous devez faire attention ici, c'est que ** nous n'utilisons pas de new lors de la création de l'instance **. En d'autres termes, c'est un programme qui peut être compilé avec juste une classe vide appelée interface.

En concevant l'interface ** 1. Je peux imaginer les fonctions à créer ** ** 2. Il a l'avantage de pouvoir être compilé même si la fonction n'est pas implémentée **.

La structure d'un tel programme On dit qu'il s'appelle le modèle de conception ** façade (entrée principale) **. (Strictement parlant, cela semble un peu différent

C'est comme ça. Si vous vous appelez désormais un service, "traitement côté service" Si vous l'appelez un contrôleur, lisez-le comme "Oh, le premier processus que le serveur reçoit." Le côté est terminé.

Le sujet principal d'ici

Tout d'abord, enregistrez l'image dans la base de données.

Commencez par créer une fonction d'entrée d'image à l'aide du référentiel JPA. C'est juste cela, donc il n'y a pas de problème.

Commencez par créer un processus pour enregistrer l'image dans la base de données.

pictureServiceImpl.java


	@Autowired
	PictureMasterRepository pRepository;

	@Override
	public int addPicture(byte[] picturedata, String pictureName, String originalName, Integer uploadUserId) {
		//TODO talon de méthode généré automatiquement
		PictureMaster input = new PictureMaster();
		
		input.setPictureData(picturedata);
		input.setPictureName(pictureName);
		input.setOriginalName(originalName);
		input.setUploadUserId(uploadUserId);
		
		pRepository.saveAndFlush(input);
		
		return 0;

Ensuite, créez un processus pour lire l'image. Créons l'accès à la base de données en utilisant la fonction d'implémentation automatique du référentiel JPA.

PictureMasterRepository.java


@Repository
public interface PictureMasterRepository extends JpaRepository<PictureMaster, Integer> {


    public PictureMaster findByPictureId(Long pictureId);
    public PictureMaster findByPictureName(String pictureName);
    

    public List<PictureMaster> findByUploadUserId(int uploadUserId);
    
    //Recherche par J'aime
//    public List<UserMaster> findByUsernameLike(String usernamename);
//    public List<UserMaster> findByEmailLike(String email);
    
//    @Query("SELECT count(*) From UserMaster u WHERE u.username = :username")
//    public int countByUsername(@Param("username")String username);
}

pictureServiceImpl.java


	/**
	 *Renvoie une image enregistrée en fonction du nom d'utilisateur
	 */
	@Override
	public List<PictureMaster> readUserPicture(Integer uploadUserId) {
		
	List<PictureMaster> searchResult = pRepository.findByUploadUserId(uploadUserId);
	
	return searchResult;
	
	}

J'ai pu effectuer des traitements spécifiques ヾ (.> ﹏ <.) Nottater

Ensuite, transmettez le processus créé au contrôleur.

ImageIOController.java



		ModelAndView mv = new ModelAndView("ImageView");
		List<PictureMaster> UserPicutres = pictureService.readUserPicture(LoginUser.getUserId());
		

Jusqu'à présent, nous avons parlé de Java. Passons les données obtenues ici à jsp!

Lecture côté jsp

À propos, le contrôleur et jsp utilisent un objet appelé Model pour échanger des valeurs. C'est un peu différent de la chaîne.

Utilisons maintenant les dernières technologies. L'image enregistrée dans le DB est une donnée binaire, Convertissez-le en BASE64.

BASE64 est une méthode de codage pour échanger des données binaires à grande vitesse sur le Web. Remplace les données telles que les nombres hexadécimaux ordinaires par des données de 64 caractères de base. Il est implémenté à partir de Java8, alors utilisons-le.

ImageIOController.java


	@RequestMapping(value = "/imageView", method = RequestMethod.GET)
	public ModelAndView imageView(Principal principal) {
		
		//Obtenez des identifiants
        Authentication auth = (Authentication)principal;
        LoginUserDetails LoginUser = (LoginUserDetails)auth.getPrincipal();
		
		//Obtenir l'image d'enregistrement de l'utilisateur
		ModelAndView mv = new ModelAndView("ImageView");
		List<PictureMaster> UserPicutres = pictureService.readUserPicture(LoginUser.getUserId());
		
		for(PictureMaster pict:UserPicutres) {
			//Obtenir l'extension
			pict.setExtension(pict.getOriginalName().substring(pict.getOriginalName().length() - 4, pict.getOriginalName().length()));
			//Convertir en BASE64
			pict.setBase64string(Base64.getEncoder().encodeToString(pict.getPictureData()));
			//Supprimer les données binaires
			pict.setPictureData(null);
		}
		
		mv.addObject("UserName",LoginUser.getUsername());
		mv.addObject("UserPictures", UserPicutres);
		
		return mv;
	}

Comme ça. Veuillez consulter les commentaires pour connaître le contenu du processus.

Créons le traitement côté jsp.

ImageVire.html


<%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<head>
<meta content="ja" http-equiv="Content-Language" />
<meta content="text/html; charset=utf-8" http-equiv="Content-Type" />
<title>Veuillez saisir votre image de mer ou d'eau préférée</title>
</head>

<body>
<p>
${UserName}C'est une image enregistrée par M. ヾ(¡>﹏<¡)Non</p>
<c:forEach var="picture" items="${UserPictures}" varStatus="status">

	<p>${picture.pictureName}</p>
	<img src="data:image/${picture.extension};base64,${picture.base64string}">

</c:forEach>
</body>

</html>


La boucle est bouclée avec la balise ** c ** habituelle. Le point est la balise ici.

Spécifiez l'extension avec ** $ {picture.extension} **, ** base64, $ {picture.base64string} ** spécifie le binaire base64.

En d'autres termes, la sortie HTML réelle ressemble à ceci.

ImageView.html


<img src="data:image/${picture.extension};base64,${picture.base64string}">

Courir

Courons

image.png

J'ai pu afficher l'image enregistrée comme ceci.

référence Comment intégrer une image directement dans un fichier HTML avec Base64 Je veux savoir comment saisir une image ou un fichier (pdf, etc.) dans JSP, l'enregistrer dans la base de données, puis l'appeler et l'afficher à l'écran.

Recommended Posts

Implémenter l'entrée / sortie d'image avec Spring MVC
Juste des images d'entrée et de sortie avec Spring MVC
Implémenter le téléchargement de fichiers avec Spring MVC
J'ai essayé d'implémenter le téléchargement de fichiers avec Spring MVC
Configuration Java avec Spring MVC
Implémenter GraphQL avec Spring Boot
Implémenter CRUD avec Spring Boot + Thymeleaf + MySQL
Écrivons l'entrée / sortie de fichier Java avec NIO
Essayez d'implémenter la fonction de connexion avec Spring Boot
[Spring] Implémenter le formulaire de saisie (écran de saisie ⇒ écran de confirmation ⇒ écran de fin)
Demander un exemple de sortie du journal des paramètres Java et Spring MVC
[Procédure de mise en œuvre] Implémentez la fonction de téléchargement d'images avec Active Storage
Mémo d'utilisation de Spring Security: coopération avec Spring MVC et Boot
Implémentez une API Rest simple avec Spring Security avec Spring Boot 2.0
Ressort avec actionneur Kotorin --5
Validation personnalisée avec Spring
Printemps avec Kotorin ―― 1. INITIALISATION PRINTEMPS
Télécharger avec Spring Boot
Sortie FizzBuzz avec flux
MOCK les constructeurs d'autres classes avec Spring MVC + PowerMock + Junit
Sortez le journal d'accès Tomcat intégré à la sortie standard avec Spring Boot
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Flux jusqu'à la sortie des données de la table à afficher avec Spring Boot
Pour recevoir une demande vide avec Spring Web MVC @RequestBody
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
Implémentez une API Rest simple avec Spring Security & JWT avec Spring Boot 2.0
[Java] Je souhaite tester l'entrée standard et la sortie standard avec JUnit