若依下载的逻辑是指定文件存储的路径,在ruoyi-admin模块下的application.yml中配置路径结尾必须要加'/'或者'\'结尾。
他使用的是虚拟路径映射,所以文件名必须是配置路径下真实的文件名。
若依采用的是流的方式,前端必须要用bolb的方式去接收,然后保存成本地文件。
后端代码
参数一:配置路径下,真实的文件名。
参数二:是否下载后删除,false不删除。
@AutowiredRuoYiConfig RuoYiConfig;@GetMapping("/downloadZip")public void fileDownload(@RequestParam String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request) {try {System.out.println("文件名称:" + fileName);if (!FileUtils.checkAllowDownload(fileName)) {throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));}String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);String filePath = RuoYiConfig.getDownloadPath() + fileName;response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);FileUtils.setAttachmentResponseHeader(response, realFileName);FileUtils.writeBytes(filePath, response.getOutputStream());if (delete) {FileUtils.deleteFile(filePath);}} catch (Exception e) {e.printStackTrace();System.out.format("下载文件失败", e);}}
前端代码
import request from '@/utils/request'export const publishExportTemplateFile = (res, name, type = false) => {let url;if (type) {url = window.URL.createObjectURL(new Blob([res], {type: 'application/zip'}));} else {url = window.URL.createObjectURL(new Blob([res]));}// const url = window.URL.createObjectURL(new Blob([res]));const link = document.createElement('a');link.style.display = 'none';link.href = url;link.setAttribute('download', name);document.body.appendChild(link);link.click();document.body.removeChild(link);
}export function downloadFile(filePath) {request({url: '/projectAch/pages/downloadZip',method: 'get',params: {fileName: filePath, delete: false},responseType: 'blob' // 设置响应类型为 blob}).then(response => {publishExportTemplateFile(response ,filePath);}).catch(error => {console.error('Download file failed:', error);});
}