前端下载xlsx文件、视频录制.h264文件

后端接口/**/export定义 content-type: application/octet-stream

前端:

  1. headers 中需要加 headers['Content-Type'] = 'application/octet-stream';

  1. 前端在请求时必须要加上responseType, 否则 在下载下来的文件打开无法被解析

config.responseType = 'blob';

1,2在axios 请求时加上可正常解析

前端处理逻辑封装


export async function downloadFileMessage(response, data, fileName) {
  // 如果响应体Body已经被使用过,那么clone()会抛出一个TypeError。实际上,clone() 的主要作用就是支持Body对象的多次使用
  const blob = data?.blob ? await data.clone().blob() : new Blob([data]);
  const a = document.createElement('a');
  const downloadUrl = window.URL.createObjectURL(blob);
  const contentDisposition = response.headers ? response.headers['content-disposition'] : `filename=${fileName}`;
  if (contentDisposition) {
    const name = contentDisposition.split('filename=')[1].replace(/"/g, '');
    a.href = downloadUrl;
    a.download = name || fileName;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    window.URL.revokeObjectURL(downloadUrl);
    return;
  }
  // 只能消费Response.json()一次,如果你消费不止一次,就会发生错误。TypeError: Failed to execute 'json' on 'Response': body stream already read
  const jsonData = await data.clone().json();
  if (jsonData && (jsonData?.status === '500' || jsonData?.status === 500)) {
    message.error(jsonData?.message || '下载失败');
  }
}

视频录制.h264文件

export const donwloadFile = (response, fileName) => {
  const fileReader = new FileReader();
  let name = fileName;
  if (response.headers["content-disposition"]) {
    name = decodeURI(
      response.headers["content-disposition"]
        .split(";")[1]
        .split("filename=")[1]
    );
  }

  fileReader.onload = () => {
    const blob = new Blob([response.data], {
      type: response?.data?.type,
    });
    const url = window.URL.createObjectURL(blob);
    const link = document.createElement("a");
    link.href = url;
    link.setAttribute("download", name ?? fileName);
    document.body.appendChild(link);
    link.click();
    URL.revokeObjectURL(link.href);
    document.body.removeChild(link);
  };
  fileReader.readAsText(response.data);
};

使用

  downloadVideoFile: async function (video, deviceId) {
      try {
        // 结束录制
        await saveVideo({ video, deviceId, flag: 0 });
        this.$message.success("结束录制");
        this.recording = !this.recording;
        try {
          const response = await downloadVideo({
            deviceId,
            filename: this.filename,
          });
          const time = dayjs(new Date().getTime()).format(
            "YYYY_MM_DD_HH_mm_ss"
          );
          const newName = `${name}_${time}.h264`;
          await donwloadFile(response, newName);
          this.$message.success("完成下载");
        } catch (error) {
          throw error;
        }
      } catch (error) {
        throw error;
      }
    },

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值