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
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.
Commençons par définir le fichier. Définissez le fichier dans ** src / main / resources **.
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.
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 ().
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.
É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.
Accédons à l'adresse réelle.
↓
J'ai pu télécharger sample.xml depuis le serveur.
http://bookmount8.blog.fc2.com/blog-entry-49.html?
Recommended Posts