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