SpringBoot io stream exporta Excel almacenado en Recurso

Excel para transmitir, descargar. Localmente, el servidor informa:

Problema 1: FileNotFoundException (el nombre de archivo, el nombre del directorio o la sintaxis de la etiqueta del volumen es incorrecta).

java.io.FileNotFoundException: archivo:\E:\liziyi\guopei6\gp6-exam\target\gp6-exam-0.0.1-SNAPSHOT.jar!\BOOT-INF\classes!\exceltemplate\exam_record_import_template.xls (nombre de archivo, el nombre del directorio o la sintaxis de la etiqueta del volumen es incorrecta).

El código fuente informa el error anterior, porque el servidor necesita crear un paquete jar y ejecutarlo. El uso de getResourceAsStream() para consultar la dirección del archivo informará un error:

 public String download(String fileName, String folder, HttpServletRequest request, HttpServletResponse response) {
        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");
        response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
        try {
            String path = this.getClass().getClassLoader().getResource(folder + "/" + fileName).getPath();
            InputStream inputStream = new FileInputStream(new File(path));
            OutputStream os = response.getOutputStream();
            byte[] b = new byte[2048];
            int length;
            while ((length = inputStream.read(b)) > 0) {
                os.write(b, 0, length);
            }
            // 这里主要关闭。
            os.close();

            inputStream.close();
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }

Solución:

Debido a que el jar es un paquete comprimido, debe usarse getResourceAsStream en lugar de getResource

public String download(String fileName, String folder, HttpServletRequest request, HttpServletResponse response) {
        response.setCharacterEncoding("utf-8");
        response.setContentType("multipart/form-data");
        response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
        try {
        InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(folder + "/" + fileName);
            OutputStream os = response.getOutputStream();
            byte[] b = new byte[2048];
            int length;
            while ((length = inputStream.read(b)) > 0) {
                os.write(b, 0, length);
            }
            // 这里主要关闭。
            os.close();

            inputStream.close();
        } catch (FileNotFoundException e) {
            log.error(e.getMessage(), e);
        } catch (IOException e) {
            log.error(e.getMessage(), e);
        }
        return null;
    }

问题二:getOutputStream() ya ha sido llamado para esta respuesta

Traducción: se ha llamado a getOutputStream() para esta respuesta o: se ha utilizado response.getOutputStream() y no se puede volver a utilizar.

Pero cuando se ejecuta, se encuentra que es causado por un puntero nulo, que no tiene nada que ver con los dos métodos verificados en la siguiente figura. 

Luego resuelva this.getClass().getClassLoader().getResourceAsStream (¿por qué obtener nulo

Pregunta 3: this.getClass().getClassLoader().getResourceAsStream() obtiene el valor de Null

Lo primero que debe tener en cuenta es por qué el archivo obtenido es nulo.

1. El método causa el error.

Primero, sospecho que el método es incorrecto, después de todo, hay n formas de exportar archivos con secuencias. Aquí está la definición de la consulta en línea:

1. Class.getResourceAsStream(String path) : path 不以’/'开头时默认是从此类所在的包下取资源,以’/'开头则是从ClassPath根下获取。其只是通过path构造一个绝对路径,最终还是由ClassLoader获取资源。 

2.Class.getClassLoader.getResourceAsStream(String path) :默认则是从ClassPath根下获取,path不能以’/'开头,最终是由ClassLoader获取资源。 

no lo entiendo esta bien

2. La ubicación causa el error

Mi archivo de Excel local se coloca en el módulo de examen, el método de descarga de Excel se coloca en el módulo de modelo, los módulos Lms, Order y Exam llaman al módulo de modelo y luego van al módulo de examen para descargar el archivo.

Ahora la prueba del módulo de examen puede obtener el archivo, otros módulos no pueden. Debido a que no hay otros módulos en el archivo, se informa un error.

Luego, mueva el Excel del módulo de examen a cada módulo, para que la clase obtenga el archivo de Excel de este módulo. Realmente resolvió el problema. Como se muestra abajo:

Para ser agregado:

Excel, generar primero, luego descargar

archivo de descarga de excel usando subprocesos múltiples y redis

Supongo que te gusta

Origin blog.csdn.net/Ciel_Y/article/details/123376492
Recomendado
Clasificación