[JAVA] Implementieren Sie den Dateidownload mit Spring MVC

Ich habe die Datei heruntergeladen.

Für XML-Dateien nur für den Controller

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();
        }
    }

Wenn Sie so etwas schreiben, können Sie gehen, aber dies wird im Browser angezeigt und endet, also Immerhin möchte ich es im Download-Ordner. Notieren Sie sich, wie es geht

Zusammensetzung der zu erledigenden Dinge

  1. Lesen Sie die Datei
  2. In Byte-Format konvertieren
  3. Schreiben Sie in OutputStream

So werden drei Prozesse ausgeführt. Geben Sie zum Schluss eine entsprechende Ansicht zurück (null ist in Ordnung), um die Download-Funktion abzuschließen.

1. Lesen Sie die Datei

Lassen Sie uns zuerst die Datei einstellen. Stellen Sie die Datei in ** src / main / resources ** ein.

image.png

Stellen Sie diesmal diese sample.xml ein

Erstellen Sie den Teil des Controllers, der die Datei liest.

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");
        }
}

Dies ist alles, was Sie zum Lesen der Datei benötigen. ** ResourceLoader wird beim Erstellen des Kontexts automatisch im DI-Container registriert ** (wie), sodass Sie ihn nicht einmal in die XML-Datei schreiben müssen. Vielen Dank, dass Sie @Autowired.

2. In Byte-Format konvertieren

Teilen wir die Verarbeitung auf. Erstellen Sie eine neue private Methode.

XMLController.java


	/**
	 *Von InputStream in Byte-String konvertieren
	 * @param filepath
	 * @return
	 */
	private byte[] StreamToByte(Resource resource) {
		
	int nRead;
    InputStream is = null;
    byte[] fileContent = new byte[16384];
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
	
    //Konvertieren Sie die Datei in das Byte-Format
    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) {
		//TODO automatisch generierter Fangblock
		e.printStackTrace();
	}
    return null;
	}

Was Spring tut, ist nur der Teil ** resource.getFile (). ToString () ** in Zeile 15. Dies ist die ** getFile () ** -Methode, mit der Sie die Dateien unter src / main / resource im Dateiformat abrufen können. Es ist positiv, dass es von toString () in eine absolute Adresse konvertiert wird.

Nun, da es eine große Sache ist, erkläre ich auch den Java-Code

XMLController.java


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

        buffer.flush();

Dies ist der Hauptteil des Schreibens in BufferdOutputStream. Die Daten werden in einem Puffer gespeichert und blitzschnell ausgeführt. Es sieht aus wie C, ist aber bereits eine feste Phrase. Danach bekam ich die Ausnahme mit try ~ catch.

3. Schreiben Sie in OutputStream

Schreiben Sie in den Ausgabestrom der Antwort Lassen Sie uns zunächst den Header für welche Art von Datei festlegen.

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);
        
//		//Datei schreiben
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=" + "sample.xml");
        response.setContentLength(fileContent.length);

       }

In setContentType wird ein Typ angegeben, der als Binärdatei bezeichnet wird. Der Dateiname wird in response.setHeader angegeben, dies ist jedoch der Name der Datei, die tatsächlich heruntergeladen wird. response.setContentLength ist die Größe der Datei.

Schreiben wir nun die erstellte Binärdatei in OutputStream Dies wird auch in einer anderen Methode geschrieben.

XMLController.java


	/**
	 *Download-Datei schreiben
	 * @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();
        }
	}

Es wird keine besonderen Schwierigkeiten geben. Schreiben Sie mit os.write und führen Sie den Stream mit os.flush aus.

Integrieren Sie diese Methode in Ihren Controller.

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);
        
//		//Datei schreiben
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=" + "sample.xml");
        response.setContentLength(fileContent.length);
		
        OutputSreamWrite(response, fileContent);
        
        return null;
	}

Mit diesem Gefühl wird die endgültige Form des Controllers so sein

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);
        
//		//Datei schreiben
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename=" + "sample.xml");
        response.setContentLength(fileContent.length);
		
        OutputSreamWrite(response, fileContent);
        
        return null;
	}
	
	/**
	 *Von InputStream in Byte-String konvertieren
	 * @param filepath
	 * @return
	 */
	private byte[] StreamToByte(Resource resource) {
		
	int nRead;
    InputStream is = null;
    byte[] fileContent = new byte[16384];
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
	
    //Konvertieren Sie die Datei in das Byte-Format
    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) {
		//TODO automatisch generierter Fangblock
		e.printStackTrace();
	}
    return null;
	}
	
	/**
	 *Download-Datei schreiben
	 * @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();
        }
	}
}


Es ist etwas länger her. Die mühsame Verarbeitung ist jedoch getrennt. Wenn ich von nun an eine neue Download-Funktion erstelle, versuche ich, die mühsame Verarbeitung zu verwenden. Da ich jeden Prozess einzeln erkläre, habe ich mich gefragt, ob ich das kleine fertige Produkt verstehen soll, anstatt das Ganze auf einmal zu erfassen.

Lass uns rennen

Lassen Sie uns auf die tatsächliche Adresse zugreifen.

image.png

image.png

Ich konnte sample.xml vom Server herunterladen.

Referenz

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

Recommended Posts

Implementieren Sie den Dateidownload mit Spring MVC
Ich habe versucht, das Hochladen von Dateien mit Spring MVC zu implementieren
Implementieren Sie die Bildeingabe / -ausgabe mit Spring MVC
Mit Spring Boot herunterladen
Java-Konfiguration mit Spring MVC
Implementieren Sie GraphQL mit Spring Boot
Datei-Upload mit Spring Boot
Memorandum zum Herunterladen lokaler Dateien mit Spring Boot
So erreichen Sie den Dateidownload mit Feign
Implementieren Sie CRUD mit Spring Boot + Thymeleaf + MySQL
Implementieren Sie die Paging-Funktion mit Spring Boot + Thymeleaf
Geben Sie einfach Bilder mit Spring MVC ein und geben Sie sie aus
Testen Sie den Controller mit Mock MVC im Spring Boot
So erstellen Sie ein Excel-Formular mithilfe einer Vorlagendatei mit Spring MVC
[Hinweis] Festlegen der Datei bei Verwendung von Logback mit Spring Boot
[Spring] Lesen Sie mit MessageSource eine Nachricht aus einer YAML-Datei
Verwendungshinweis zu Spring Security: Zusammenarbeit mit Spring MVC und Boot
Feder mit Kotorin --5 Aktuator
Bequemer Download mit JAVA
Implementieren Sie eine einfache Rest-API mit Spring Security mit Spring Boot 2.0
Java-Download mit Ansible
Selbstgemachte Validierung mit Spring
Datei-Upload mit Spring Boot (keine mehrteilige Datei verwenden)
Frühling mit Kotorin ―― 1. SPRING INITIALIZR
Implementieren Sie die REST-API mit Spring Boot und JPA (Application Layer).
Implementieren Sie die REST-API mit Spring Boot und JPA (Infrastructure Layer).
Schneiden Sie SQL in die Eigenschaftendatei mit jdbcTemplate von Spring Boot aus
Überschreiben Sie die Bean-Definition in der Spring-XML-Konfigurationsdatei mit einer anderen XML
So erhalten Sie eine leere Anfrage mit Spring Web MVC @RequestBody
Implementieren Sie die REST-API mit Spring Boot und JPA (Domain Layer Edition).
Implementieren Sie eine einfache Rest-API mit Spring Security & JWT mit Spring Boot 2.0
Generieren Sie mit Spring Boot einen Barcode
Hallo Welt mit Spring Boot
Frühling mit Kotorin --- 8. Aufbewahrungsschicht
Beginnen Sie mit Spring Boot
Hallo Welt mit Spring Boot!
Feder mit Kotorin --6 Asynchrone Verarbeitung
Führen Sie LIFF mit Spring Boot aus
SNS-Login mit Spring Boot
jCaptcha-Reload mit Ajax implementiert
Spring Boot beginnt mit dem Kopieren
Spring Awakening Strategy Spring MVC Teil 1
Feder mit Kotorin ―― 7. Serviceschicht
Anmeldefunktion mit Spring Security
Verwenden von Mapper mit Java (Spring)
Spring Boot beginnend mit Docker
Hallo Welt mit Spring Boot
Setzen Sie Cookies mit Spring Boot
Verwenden Sie Spring JDBC mit Spring Boot
Spring Awakening Strategy Spring MVC Teil 4
Modul mit Spring Boot hinzufügen
Erste Schritte mit Spring Boot
API mit Spring + Vue.js verknüpfen
Spring Awakening Strategy Spring MVC Teil 3
Erstellen Sie mit Spring Boot einen Mikrodienst
Mail mit Spring Boot verschicken
[Einführung] Erstellen Sie MVC mit Scala
Spring Awakening Strategy Spring MVC Teil 2
Implementieren Sie einen einfachen Web-REST-API-Server mit Spring Boot + MySQL