[JAVA] Implémenter le téléchargement de fichiers avec Spring MVC

J'ai téléchargé le fichier.

Pour les fichiers XML, juste pour le contrôleur

Controller.java



	@Autowired
	ResourceLoader resourceLoader;

    @RequestMapping(value = "/file_download", produces = MediaType.APPLICATION_XML_VALUE)
    public Resource xmlfile() {

        Resource resource = resourceLoader.getResource("classpath:sample.xml");
       try{
        return new FileSystemResource(resource.getFile().toString());
        } catch (FileNotFoundException e) {
    	e.getStackTrace();
        }
    }

Si vous écrivez quelque chose comme ça, vous pouvez y aller, mais cela s'affiche sur le navigateur et cela se termine, donc Après tout, je le veux dans le dossier de téléchargement. Notez comment le faire

Composition des choses à faire

  1. Lisez le fichier
  2. Convertir au format octet
  3. Ecrire dans OutputStream

Trois processus sont exécutés comme ça. Enfin, retournez une vue appropriée (null est bien) pour terminer la fonction de téléchargement.

1. Lisez le fichier

Commençons par définir le fichier. Définissez le fichier dans ** src / main / resources **.

image.png

Cette fois, définissez ce sample.xml

Créez la partie du contrôleur qui lit le fichier.

XMLController.java


@RestController
public class XMLController {

	@Autowired
	ResourceLoader resourceLoader;

	@RequestMapping(value="/personize", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	public String personize(HttpServletResponse response) {
		
		Resource resource = resourceLoader.getResource("classpath:sample.xml");
        }
}

C'est tout ce dont vous avez besoin pour lire le fichier. ** ResourceLoader est automatiquement enregistré dans le conteneur DI lorsque le contexte est créé ** (comme), vous n'avez donc même pas besoin de l'écrire dans le fichier xml. Merci @Autowired.

2. Convertir au format octet

Divisons le processus. Créez une nouvelle méthode privée.

XMLController.java


	/**
	 *Convertir de InputStream en chaîne d'octets
	 * @param filepath
	 * @return
	 */
	private byte[] StreamToByte(Resource resource) {
		
	int nRead;
    InputStream is = null;
    byte[] fileContent = new byte[16384];
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
	
    //Convertir le fichier au format octet
    try {
        is = new FileInputStream(resource.getFile().toString());
        
        while ((nRead = is.read(fileContent, 0, fileContent.length)) != -1) {
        	  buffer.write(fileContent, 0, nRead);
        	}

        	buffer.flush();
        	
        	return buffer.toByteArray();
    } catch (FileNotFoundException e) {
    	e.getStackTrace();
    } catch (IOException e) {
		//Bloc de capture généré automatiquement TODO
		e.printStackTrace();
	}
    return null;
	}

Ce que Spring fait, c'est uniquement la partie ** resource.getFile (). ToString () ** de la ligne 15. C'est la méthode ** getFile () **, qui vous permet d'obtenir les fichiers sous src / main / resource au format File. Il est affirmatif qu'elle soit convertie en adresse absolue par toString ().

Eh bien, puisque c'est un gros problème, j'explique aussi le code Java

XMLController.java


        while ((nRead = is.read(fileContent, 0, fileContent.length)) != -1) {
        	  buffer.write(fileContent, 0, nRead);
        	}

        buffer.flush();

C'est la partie principale de l'écriture dans BufferdOutputStream. Les données sont stockées dans un tampon et exécutées en flash. Cela ressemble à C, mais c'est déjà une phrase fixe. Après cela, j'ai eu l'exception avec try ~ catch.

3. Ecrire dans OutputStream

Écrire dans le flux de sortie de la réponse Tout d'abord, définissons l'en-tête de quel type de fichier.

XMLController.java


	@RequestMapping(value="/personize", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	public String personize(HttpServletResponse response) {
		
		Resource resource = resourceLoader.getResource("classpath:sample.xml");
		
		byte[] fileContent = null;
		
		fileContent = StreamToByte(resource);
        
//		//Écriture de fichier
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=" + "sample.xml");
        response.setContentLength(fileContent.length);

       }

Dans setContentType, un type appelé fichier binaire est spécifié. Le nom du fichier est spécifié dans response.setHeader, mais il s'agit du nom du fichier réellement téléchargé. response.setContentLength est la taille du fichier.

Maintenant, écrivons le binaire créé dans OutputStream Ceci est également écrit dans une autre méthode.

XMLController.java


	/**
	 *Écrire le fichier de téléchargement
	 * @param response
	 * @param fileContent
	 */
	public void OutputSreamWrite(HttpServletResponse response, byte[] fileContent) {
        OutputStream os = null;
        try {
            os = response.getOutputStream();
            os.write(fileContent);
            os.flush();
        } catch (IOException e) {
            e.getStackTrace();
        }
	}

Il n'y aura pas de difficulté particulière. Écrivez avec os.write et exécutez le flux avec os.flush.

Incorporez cette méthode dans votre contrôleur.

XMLController.java


	@RequestMapping(value="/personize", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	public String personize(HttpServletResponse response) {
		
		Resource resource = resourceLoader.getResource("classpath:sample.xml");
		
		byte[] fileContent = null;
		
		fileContent = StreamToByte(resource);
        
//		//Écriture de fichier
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=" + "sample.xml");
        response.setContentLength(fileContent.length);
		
        OutputSreamWrite(response, fileContent);
        
        return null;
	}

Avec ce sentiment, la forme finale du contrôleur sera comme ça

XMLController.java


package tsugaruinfo.controller;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Controller
public class XMLController {

	@Autowired
	ResourceLoader resourceLoader;
	
	DomController(){
		
	}
	
	@RequestMapping(value="/personize", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
	public String personize(HttpServletResponse response) {
		
		Resource resource = resourceLoader.getResource("classpath:sample.xml");
		
		byte[] fileContent = null;
		
		fileContent = StreamToByte(resource);
        
//		//Écriture de fichier
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=" + "sample.xml");
        response.setContentLength(fileContent.length);
		
        OutputSreamWrite(response, fileContent);
        
        return null;
	}
	
	/**
	 *Convertir de InputStream en chaîne d'octets
	 * @param filepath
	 * @return
	 */
	private byte[] StreamToByte(Resource resource) {
		
	int nRead;
    InputStream is = null;
    byte[] fileContent = new byte[16384];
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
	
    //Convertir le fichier au format octet
    try {
        is = new FileInputStream(resource.getFile().toString());
        
        while ((nRead = is.read(fileContent, 0, fileContent.length)) != -1) {
        	  buffer.write(fileContent, 0, nRead);
        	}

        	buffer.flush();
        	
        	return buffer.toByteArray();
    } catch (FileNotFoundException e) {
    	e.getStackTrace();
    } catch (IOException e) {
		//Bloc de capture généré automatiquement TODO
		e.printStackTrace();
	}
    return null;
	}
	
	/**
	 *Écrire le fichier de téléchargement
	 * @param response
	 * @param fileContent
	 */
	public void OutputSreamWrite(HttpServletResponse response, byte[] fileContent) {
        OutputStream os = null;
        try {
            os = response.getOutputStream();
            os.write(fileContent);
            os.flush();
        } catch (IOException e) {
            e.getStackTrace();
        }
	}
}


Ça fait un peu plus longtemps. Cependant, le traitement gênant est séparé, donc lors de la création d'une nouvelle fonction de téléchargement à partir de maintenant, j'essaie d'utiliser le traitement gênant. Puisque j'explique chaque processus individuellement, je me suis demandé si je devais comprendre le petit produit fini plutôt que de saisir le tout d'un coup.

Courons

Accédons à l'adresse réelle.

image.png

image.png

J'ai pu télécharger sample.xml depuis le serveur.

référence

http://bookmount8.blog.fc2.com/blog-entry-49.html?

Recommended Posts

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
Implémenter l'entrée / sortie d'image avec Spring MVC
Télécharger avec Spring Boot
Configuration Java avec Spring MVC
Implémenter GraphQL avec Spring Boot
Téléchargement de fichiers avec Spring Boot
Mémorandum de téléchargement de fichier local avec Spring Boot
Comment réaliser le téléchargement de fichiers avec Feign
Implémenter CRUD avec Spring Boot + Thymeleaf + MySQL
Implémenter la fonction de pagination avec Spring Boot + Thymeleaf
Juste des images d'entrée et de sortie avec Spring MVC
Testez le contrôleur avec Mock MVC dans Spring Boot
Comment créer un formulaire Excel à l'aide d'un fichier modèle avec Spring MVC
[Note] Fichier de configuration lors de l'utilisation de Logback avec Spring Boot
[Spring] Lire un message à partir d'un fichier YAML avec MessageSource
Mémo d'utilisation de Spring Security: coopération avec Spring MVC et Boot
Ressort avec actionneur Kotorin --5
Téléchargement confortable avec JAVA
Implémentez une API Rest simple avec Spring Security avec Spring Boot 2.0
Téléchargement Java avec Ansible
Validation personnalisée avec Spring
Téléchargement de fichiers avec Spring Boot (ne pas utiliser de fichier en plusieurs parties)
Printemps avec Kotorin ―― 1. INITIALISATION PRINTEMPS
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)
Découpez SQL en fichier de propriété avec jdbcTemplate of spring boot
Remplacez la définition du bean dans le fichier de configuration spring xml par un autre xml
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
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Spring with Kotorin --- 8. Couche de référentiel
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Spring avec Kotorin --6 Traitement asynchrone
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
reload jCaptcha implémenté avec ajax
Spring Boot commençant par copie
Spring Awakening Strategy Spring MVC Partie 1
Ressort avec Kotorin ―― 7. Couche de service
Fonction de connexion avec Spring Security
Utilisation de Mapper avec Java (Spring)
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Spring Awakening Strategy Spring MVC Partie 4
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Lier l'API avec Spring + Vue.js
Spring Awakening Strategy Spring MVC Partie 3
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
[Introduction] Construire MVC avec Scala
Spring Awakening Strategy Spring MVC Partie 2
Implémentez un serveur API Web REST simple avec Spring Boot + MySQL