Saltar al contenido

Devuelve el archivo de Spring @Controller con OutputStream

Solución:

Obtenga OutputStream de HttpServletResponse y escriba el archivo en él (en este ejemplo, usando IOUtils de Apache Commons)

@RequestMapping(value = "/download", method = RequestMethod.GET)
public void download(HttpServletResponse response) {
    ...
    InputStream inputStream = new FileInputStream(new File(PATH_TO_FILE)); //load the file
    IOUtils.copy(inputStream, response.getOutputStream());
    response.flushBuffer();
    ...
}

Asegúrese de usar un try / catch para cerrar las transmisiones en caso de una excepción.

La solución más preferible es usar InputStreamResource con ResponseEntity. Todo lo que necesitas está listo Content-Length a mano:

@RequestMapping(value = "/download", method = RequestMethod.GET)
public ResponseEntity download() throws IOException {
    String filePath = "PATH_HERE";
    InputStream inputStream = new FileInputStream(new File(filePath));
    InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
    HttpHeaders headers = new HttpHeaders();
    headers.setContentLength(Files.size(Paths.get(filePath)));
    return new ResponseEntity(inputStreamResource, headers, HttpStatus.OK);
}

Podrías usar el ByteArrayOutputStream y ByteArrayInputStream. Ejemplo:

// A ByteArrayOutputStream holds the content in memory
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

// Do stuff with your OutputStream

// To convert it to a byte[] - simply use
final byte[] bytes = outputStream.toByteArray();

// To convert bytes to an InputStream, use a ByteArrayInputStream
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);

Puedes hacer lo mismo con otros pares de corrientes. Por ejemplo, los flujos de archivos:

// Create a FileOutputStream
FileOutputStream fos = new FileOutputStream("filename.txt");

// Write contents to file

// Always close the stream, preferably in a try-with-resources block
fos.close();

// The, convert the file contents to an input stream
final InputStream fileInputStream = new FileInputStream("filename.txt");

Y, al usar Spring MVC, definitivamente puede devolver un byte[] que contiene su archivo. Solo asegúrese de anotar su respuesta con @ResponseBody. Algo como esto:

@ResponseBody
@RequestMapping("/myurl/{filename:.*}")
public byte[] serveFile(@PathVariable("file"} String file) throws IOException {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
    DbxEntry.File downloadedFile = client.getFile("https://foroayuda.es/" + filename, null, outputStream);
    return outputStream.toByteArray();
} 
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *