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
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.
Lassen Sie uns zuerst die Datei einstellen. Stellen Sie die Datei in ** src / main / resources ** ein.
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.
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.
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.
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.
Lassen Sie uns auf die tatsächliche Adresse zugreifen.
↓
Ich konnte sample.xml vom Server herunterladen.
http://bookmount8.blog.fc2.com/blog-entry-49.html?
Recommended Posts