mvc framework example descargar archivos java spring-mvc download

java - framework - Spring MVC: archivos grandes para descargar, OutOfMemoryException



spring mvc download excel file example (1)

¿Cómo proporcionar archivos grandes para descargar a través del controlador de primavera? Seguí algunas discusiones sobre un tema similar:

Descargar un archivo de controladores de primavera

pero esas soluciones fallan para archivos grandes ~ 300mb - 600mb. Estoy obteniendo OutOfMemoryException en la última línea:

@RequestMapping(value = "/file/{dummyparam}.pdf", method = RequestMethod.GET, produces=MediaType.APPLICATION_OCTET_STREAM_VALUE) public @ResponseBody byte[] getFile(@PathVariable("dummyparam") String dummyparam, HttpServletResponse response) { . . InputStream is = new FileInputStream(resultFile); response.setHeader("Content-Disposition", "attachment; filename=/"dummyname " + dummyparam + ".pdf/""); . . return IOUtils.toByteArray(is);

Mi (ingenua) suposición fue que IOUtils manejará incluso archivos de gran tamaño, pero esto obviamente no está sucediendo. ¿Hay alguna forma de dividir el archivo en fragmentos ya que la descarga está en progreso? Los archivos son generalmente de 300 a 600mb de ancho. El número máximo de descargas simultáneas se estima en 10.

Una manera fácil sería vincular archivos como contenido estático en el directorio del servidor web, pero nos gustaría intentar hacerlo dentro de nuestra aplicación Spring.


Es porque está leyendo todo el archivo en la memoria, usa una lectura y escritura en el búfer en su lugar.

@RequestMapping(value = "/file/{dummyparam}.pdf", method = RequestMethod.GET, produces=MediaType.APPLICATION_OCTET_STREAM_VALUE) public void getFile(@PathVariable("dummyparam") String dummyparam, HttpServletResponse response) { InputStream is = new FileInputStream(resultFile); response.setHeader("Content-Disposition", "attachment; filename=/"dummyname " + dummyparam + ".pdf/""); int read=0; byte[] bytes = new byte[BYTES_DOWNLOAD]; OutputStream os = response.getOutputStream(); while((read = is.read(bytes))!= -1){ os.write(bytes, 0, read); } os.flush(); os.close(); }