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

news/2024/12/22 20:40:38 标签: 前端, java, vue.js

在这里插入图片描述

各位小伙伴们大家好,欢迎来到这个小扎扎的专栏 总结 | 提效 | 拓展,在这个系列专栏中记录了博主在学习期间总结的大块知识点,以及日常工作中遇到的各种技术点 ┗|`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对象
  })
},

http://www.niftyadmin.cn/n/5795829.html

相关文章

HDFS的常用命令

HDFS(Hadoop Distributed File System)是Hadoop项目的核心组件之一,它是一个分布式文件系统,设计用于存储大规模数据集。以下是一些常用的HDFS命令: 1. **查看文件系统状态** - hdfs dfsadmin -report:…

Linux之压缩解压相关命令

1、gzip/gunzip 作用:压缩和解压文件 语法: #压缩 压缩后缀是.gz gzip 文件 # 解压 gunzip 文件.gz 注意: (1)只能压缩文件不能压缩目录 (2)不保留原来的文件 (3)同时多个文件会产生多个压缩包 2、zip/unzip 作用:压缩和解压…

Linux IPC:读写锁汇总整理

读写锁(Readers-Writers Locks)是一种同步机制,用于允许多个线程同时读取共享资源,但只允许一个线程写入。这种锁的设计目的是为了提高并发性能,尤其是在读操作远比写操作频繁的情况下。下面详细介绍读写锁的概念、用途…

k8s迁移——岁月云实战笔记

新系统使用rockylinux9.5,旧系统虚拟机装的是centos7 1 目标服务器 1.1 禁止swap swapoff -a vi /etc/fstab #/dev/mapper/rl-swap none swap defaults 0 0 #执行,swap一行都是0 free -h 1.2 关闭防火墙 只是为了减…

RK3588 , mpp硬编码yuv, 保存MP4视频文件.

RK3588 , mpp硬编码yuv, 保存MP4视频文件. ⚡️ 传送 ➡️ Ubuntu x64 架构, 交叉编译aarch64 FFmpeg mppRK3588, FFmpeg 拉流 RTSP, mpp 硬解码转RGBRk3588 FFmpeg 拉流 RTSP, 硬解码转RGBRK3588 , mpp硬编码yuv, 保存MP4视频文件.

【单片机】IIC需要注意什么(企业级回答)

问:IIC需要注意的有哪些 初步测试实现阶段: 1、从应用层来看,先看数据手册确定下手册中的从机地址指的是八位地址还是七位地址。 2、确定下要对应操作的读写的寄存器 3、直接在原有的demo上尝试运行,看看能不能通讯成功&#xff0…

Powershell(1)

1.Powershell认识&版本信息输出 powershell自身很强大,cmd能做到powershell都能做,cmd可以写一些简单的脚本程序,但是实现起来并不容易,它的功能和可拓展性并不是很好。但是linux shell写起来就会方便很多,在目前…

CIC滤波器算法详解与Python实现

目录 CIC滤波器算法详解与Python实现第一部分:CIC滤波器概述1.1 什么是CIC滤波器?1.2 CIC滤波器的应用1.3 CIC滤波器的优势1.4 CIC滤波器的缺点 第二部分:CIC滤波器的原理与工作机制2.1 CIC滤波器的结构2.2 CIC滤波器的工作流程2.3 CIC滤波器…