Vue 文件流下载和(PDF)预览

前端下载文件流的方法很简单,axios 的请求方式请求头增加 responseType 为 blob 响应体转成 Blob 对象

 axios({
    method: 'get',
    url: XXX,
    responseType: 'blob', // 将响应类型设置为'blob'
    data: param,  
})

我最近需求是后端成功会返回文件流。其他情况会返回状态码

然后我就兴奋的去开发了,然后问题就出来了,因为指定 responseType 所以拿到的后端数据通过 axios 之后全部变成了 Blob 对象,然后我就找不到了我的状态码了 T_T

解决办法很奇葩,用到了 FileReader 对象解决,只要解析 Blob 数据能成功,就取出 code 码提示,一旦报错,就是文件流了,哈哈哈哈哈哈

完整代码如下

    getPDFPreview(row, column, cellValue, index) {
      row.loading = true;
      const { vin, orderNum } = row;
      get({ vin, orderNum })
        .then((data) => {
          /**
           * response.addHeader("content-Disposition", "attachment,filename=" + URlEncoder.encode(filename, "UTF-8"));
           * 后端请求头 Content-Disposition 的 attachment 改为 inline 就可以支持预览
           */
          const blob = new Blob([data], { type: "application/pdf" });
          /**
           * 使用 FileReader 对象解析
           * 解析出错就是文件流 application/pdf
           * 解析出 JSON 格式就是后端返回的文件状态,提示用户
           */
          const reader = new FileReader();
          reader.onload = (event) => {
            new Promise((resolve, reject) => {
              const contents = event.target.result;
              const response = JSON.parse(contents);
              resolve(response);
            })
              .then((res) => {
                row.loading = false;
                this.$message({
                  type: "error",
                  message: res.msg,
                  customClass: this.errorCustomClass,
                  showClose: true,
                  duration: 0,
                });
              })
              .catch((_) => {
                row.loading = false;
                const url = window.URL.createObjectURL(blob);
                window.open(url);
              });
          };

          // 以文本形式读取 Blob 内容
          reader.readAsText(blob);
        })
        .catch((err) => {
          // console.log(err);
        });
    },

这里也有提到一个小技巧,下载 PDF 的时候,后端如果设置响应头 Content-Disposition 为 inline 就可以直接预览 

今天就这样!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue预览PDF文件,可以使用pdf.js库。下面是一个使用文件的示例: 1. 安装pdf.js库 使用npm安装pdf.js库: ``` npm install pdfjs-dist --save ``` 2. 创建Vue组件 创建一个Vue组件,用于显示PDF文件: ```html <template> <div ref="pdfViewer"></div> </template> <script> import pdfjsLib from 'pdfjs-dist' export default { props: { pdfFile: { type: Blob, required: true } }, mounted() { this.showPdf() }, methods: { async showPdf() { const pdfData = await this.loadPdfData() const pdf = await pdfjsLib.getDocument({ data: pdfData }).promise const canvas = document.createElement('canvas') const canvasContext = canvas.getContext('2d') const viewport = pdf.getPage(1).getViewport({ scale: 1.5 }) canvas.height = viewport.height canvas.width = viewport.width await pdf.getPage(1).render({ canvasContext, viewport }).promise this.$refs.pdfViewer.appendChild(canvas) }, async loadPdfData() { return new Promise((resolve, reject) => { const reader = new FileReader() reader.readAsArrayBuffer(this.pdfFile) reader.onload = () => resolve(reader.result) reader.onerror = error => reject(error) }) } } } </script> ``` 在上面的代码中,我们使用了pdf.js库来加载PDF文件并将其渲染到画布上。我们使用FileReader来读取文件,并将其转换为ArrayBuffer,然后将其传递给pdf.js库。 3. 在父组件中使用PDF预览组件 我们可以在父组件中使用我们创建的PDF预览组件: ```html <template> <div> <input type="file" @change="onFileSelected"> <pdf-preview v-if="pdfFile" :pdf-file="pdfFile"></pdf-preview> </div> </template> <script> import PdfPreview from './PdfPreview.vue' export default { components: { PdfPreview }, data() { return { pdfFile: null } }, methods: { onFileSelected(event) { this.pdfFile = event.target.files[0] } } } </script> ``` 在上面的代码中,我们使用文件选择器来选择PDF文件。一旦选择了文件,我们将其传递给PDF预览组件,以便预览PDF文件。 这就是使用Vue预览PDF文件的方式。需要注意的是,pdf.js库支持大多数现代浏览器,但在某些旧浏览器上可能会出现问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值