jeecgboot下载指定路径Eecel模板,路径和名称可能存在中文,以流的方式返回给前端,请提供完整的前后端代码
时间: 2025-03-13 11:01:40 浏览: 89
<think>好的,用户需要实现一个JeecgBoot后端下载指定路径下的Excel模板,路径和文件名可能包含中文,并以流的方式返回给前端。我需要先理清楚整个流程,然后分步骤处理。
首先,后端需要读取指定路径的Excel文件。由于路径和文件名可能有中文,需要注意编码问题。使用Java的File类来读取文件,确保路径正确。然后,以流的形式读取文件内容,通过HttpServletResponse输出流返回给前端。
接着,处理HTTP响应头。设置Content-Type为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,这样浏览器会识别为Excel文件。同时,设置Content-Disposition头,指定文件名,这里要注意中文文件名需要进行URL编码,使用URLEncoder.encode方法,并指定UTF-8编码,避免乱码。
然后,处理文件流。使用FileInputStream读取文件,然后通过BufferedInputStream提升读取效率。将输入流的数据写入到response的输出流中,记得使用缓冲区和循环读取,防止大文件一次性加载导致内存问题。
在前端部分,可以使用简单的window.open或者a标签触发下载,或者使用axios发送请求,但需要注意处理响应类型为blob,并创建临时URL进行下载。考虑到跨浏览器兼容性,可能需要使用不同的方法生成和触发下载链接。
另外,需要注意文件路径的安全性,防止路径遍历攻击。例如,用户传入的路径参数需要校验是否在允许的目录下,避免访问系统敏感文件。这里可能需要添加安全校验逻辑,比如检查文件是否在指定的模板目录内。
异常处理也很重要,比如文件不存在时返回404,或者权限问题返回500,并在日志中记录错误信息,方便排查问题。
现在,编写后端代码时,控制器层使用GetMapping,接收文件路径参数,调用服务层处理。服务层中读取文件,设置响应头,并传输流数据。前端使用window.open或者发送AJAX请求,处理返回的文件流并触发下载。
测试时,确保中文路径和文件名正确编码,下载的文件名正确显示,且内容无误。可能需要处理不同浏览器的兼容性问题,比如IE需要使用特定的编码方式,但现代浏览器一般支持UTF-8编码的Content-Disposition。
总结步骤:接收参数→安全校验→读取文件→设置响应头→传输流数据→前端处理下载。</think><<
以下是实现JeecgBoot下载中文路径Excel模板的前后端完整代码示例:
后端代码(SpringBoot Controller):
```java
@GetMapping("/downloadTemplate")
public void downloadTemplate(@RequestParam String filePath, HttpServletResponse response) {
try {
File file = new File(filePath);
if (!file.exists()) {
response.sendError(HttpStatus.NOT_FOUND.value(), "文件不存在");
return;
}
String fileName = file.getName();
// 设置响应头
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("UTF-8");
String encodedFileName = URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());
response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + encodedFileName);
// 使用缓冲流提高性能
try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
OutputStream os = response.getOutputStream()) {
byte[] buffer = new byte[1024];
int length;
while ((length = bis.read(buffer)) != -1) {
os.write(buffer, 0, length);
}
os.flush();
}
} catch (IOException e) {
log.error("文件下载失败", e);
response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
}
}
```
前端代码(Vue + Axios):
```javascript
// 方式1:直接通过链接下载(适合已知固定路径)
function downloadTemplate() {
const filePath = encodeURIComponent('模板/销售报表模板.xlsx');
window.open(`${API_URL}/downloadTemplate?filePath=${filePath}`);
}
// 方式2:使用axios处理(适合需要权限验证的场景)
function downloadWithAxios() {
const filePath = '模板/销售报表模板.xlsx';
axios({
url: '/downloadTemplate',
method: 'get',
params: { filePath },
responseType: 'blob'
}).then(response => {
const fileName = decodeURIComponent(
response.headers['content-disposition'].split('filename*=UTF-8\'\'')[1]
);
const url = window.URL.createObjectURL(new Blob([response.data]));
const link = document.createElement('a');
link.href = url;
link.setAttribute('download', fileName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
});
}
```
关键点解释:
1. 编码处理:使用URLEncoder对中文文件名进行UTF-8编码,解决乱码问题
2. 响应头设置:
- Content-Type指定为Excel MIME类型
- Content-Disposition使用filename*扩展参数处理UTF-8编码
3. 流式传输:使用缓冲流分块读取文件,避免内存溢出
4. 前端处理:两种方式实现下载,注意处理响应头和Blob数据
安全注意事项:
1. 应对filePath参数进行安全校验,防止路径遍历攻击
2. 建议限制文件下载目录,避免任意文件读取漏洞
3. 生产环境应添加权限验证(如添加@RequiresRoles等注解)
阅读全文
相关推荐











