Jeecg,登录才能下载文件
本文针对Jeecg 3.8.2版本,其他版本也基本通用,可参考调整。
1 背景
上传到系统的文件,可能会要求登录状态才能下载,或者下载时须记录日志,用于查看哪个用户什么时间下载了什么文件。但是系统默认的文件是上传到静态资源目录的,即使前端页面看不到,只要有链接就能下载。
2 限权文件
2.1 后端
2.1.1 配置权限
ShiroConfig.java文件中做如下修改:
@Bean("shiroFilterFactoryBean") public ShiroFilterFactorBean shiroFilter(SecurityManager securityManager) { ... // 将“anon”改为“jwt” filterChainDefinitionMap.put("/sys/common/static/**", "jwt"); ... }2.1.2 返回文件内容
CommonController.java文件修改如下:
@GetMapping(value = "/static/**") public void view(HttpServletRequest request, HttpServletResponse response) { ... try { ... outputStream = response.getOutputStream(); // Img目录下的不必鉴权 if (!imgPath.startsWith("Img/") && !imgPath.startsWith("/Img/")) { // 登录用户才能下载 LoginUser loginUser = (LoginUser) SecurityUtils.getSubject().getPrincipal(); if (loginUser == null) { OutputStreamWriter writer = new OutputStreamWriter(outputStream, "UTF-8"); BufferedWriter bufferedWriter = new BufferedWriter(writer); bufferedWriter.write("未登录,无法下载!"); response.setStatus(403); try { outputStream.close(); } catch (IOException e) { log.error(e.getMessage(), e); } return; } } ... } ... }2.2 前端
window.open(url)改为downloadFileWithToken(url)即可。
import { getToken } from '/@/utils/auth'; function downloadFileWithToken(url) { fetch(url, { method: 'GET', headers: { 'X-Access-Token': getToken(), } }).then(response => { if (!response.ok) { throw new Error(response.statusText) } return response.blob(); }).then(blob => { { // 将请求到的内容直接保存为文件 const blobUrl = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.href = blobUrl; link.download = url.indexOf('/') > -1 ? url.split('/')[url.split('/').length - 1] : url; link.style.display = 'none'; document.body.appendChild(link); link.click(); document.body.removeChild(link); window.URL.revokeObjectURL(blobUrl); } }).catch(error => { //createMessage.warning(error.message) }) }3 不限权文件
用户头像等不想限制权限时,另外配置即可。
3.1 后端
3.1.1 配置权限
ShiroConfig.java文件中做如下修改:
@Bean("shiroFilterFactoryBean") public ShiroFilterFactorBean shiroFilter(SecurityManager securityManager) { ... // 增加 filterChainDefinitionMap.put("/sys/common/static/Img/**", "anno"); // 将“anon”改为“jwt” filterChainDefinitionMap.put("/sys/common/static/**", "jwt"); ... }3.1.2 返回文件内容
如2.1.2所示。
3.2 前端
upload.ts文件修改如下:
... export function uploadImg(params: UploadFileParams, onUploadProgress: (progressEvent: ProgressEvent) => void) { // ----begin----(上传到指定目录) if (params.data) { params.data = { ...params.data, biz: "Img" } } else { params.data = { biz: "Img" } } // ----end----(上传到指定目录) return defHttp.uploadFile<UploadApiResult>( { url: `/sys/common/upload`, // 原先代码有误 onUploadProgress, }, params, { isReturnResponse: true } ); } ...