后端接口返回文件流,前端下载(java+vue)

2024-07-10 1028阅读

后端接口返回文件流,前端下载(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对象
      })
    },
    
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]