后端接口返回文件流,前端下载(java+vue)
各位小伙伴们大家好,欢迎来到这个小扎扎的专栏 总结 | 提效 | 拓展,在这个系列专栏中记录了博主在学习期间总结的大块知识点,以及日常工作中遇到的各种技术点 ┗|`O′|┛
🌆 内容速览
- 后端获取
- 前端下载
本身前端是可以直接通过文件的url对文件进行下载的,但是在进行业务对接开发的时候,前端没有获取文件下载的权限,所以需要后端获取文件之后把获得的文件流传给前端,前端通过文件流下载文件。
后端获取
controller层
/** * 根据附件id返回文件流 */ @ApiOperation(value = "根据附件id返回文件流", notes = "传入附件id") @PostMapping(value = "/getByFileId") public void getByFileId(HttpServletResponse response, @RequestBody FileIdReq fileIdReq) { matterBasicInfoService.getByFileId(response, fileIdReq.getFileId()); }service接口
void getByFileId(HttpServletResponse response, String fileId);
实现类
@Override public void getByFileId(HttpServletResponse response, String fileId) { // 获取附件详情 主要是要附件的url和名字 MatterAttachmentFormOdr matterAttachmentFormOdr = matterAttachmentFormOdrService.getById(fileId); log.error("matterAttachmentFormOdr-----:{}", matterAttachmentFormOdr); if (BeanUtil.isEmpty(matterAttachmentFormOdr) || StrUtil.isBlank(matterAttachmentFormOdr.getUrl())) { throw new BusinessValidationException("该文件不存在"); } // 附件url替换 如果url可以直接下载的话可以跳过这一步 String filePath = matterAttachmentFormOdr.getUrl().replace("......", "......"); log.error("filePath-----:{}", filePath); ServletOutputStream out = null; InputStream inputStream = null; try { //与服务器建立连接 URL url = new URL(filePath); URLConnection conn = url.openConnection(); inputStream = conn.getInputStream(); try { //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型 response.setContentType("multipart/form-data"); response.addHeader("Content-Disposition", "attachment; filename=" + matterAttachmentFormOdr.getName()); } catch (Exception e){ e.printStackTrace(); } out = response.getOutputStream(); // 读取文件流 int len = 0; byte[] buffer = new byte[1024 * 10]; while ((len = inputStream.read(buffer)) != -1) { out.write(buffer, 0, len); } log.error("读取文件流结束。。。。。。。"); } catch (Exception e){ e.printStackTrace(); } finally { try { if (out != null) { out.flush(); out.close(); } if (inputStream != null) { inputStream.close(); } } catch (IOException e) { throw new RuntimeException(e); } } }前端下载
handleGetFile(file) { const type = file.url.split('.')['1'] if (!file.id) { this.$Message.warning('文件下载失败!') return } // 定义参数 const data = { data: { fileId: file.id, }, access_token: xxxxxx, } // 调用后端接口 this.$store.dispatch('comprehensive/getByFileId', data).then(res => { this.$Message.loading(`正在下载${file.name}数据`) const applicationType = this.getFileTypeMime(type) const blob = new Blob([res.data], { type: applicationType }) const link = document.createElement('a') const href = window.URL.createObjectURL(blob) // 创建下载的链接 link.href = href link.download = `${file.name}` // 下载后文件名 document.body.appendChild(link) link.click() // 点击下载 document.body.removeChild(link) // 下载完成移除元素 window.URL.revokeObjectURL(href) // 释放掉blob对象 }) },
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

