antdPro中使用自带umi的fecth,Blob实现预览文件的踩坑之旅

1、因项目需要实现在线预览功能,正常后台返回blob流,进行如下代码设置便可

        let documentType = mimeType(fileType);
        let blob = new Blob([res], { type: documentType + ';chartset=UTF-8' });
        const blobUrl = window.URL.createObjectURL(blob);
        //down
        if (type === 'down') {
          const aElement = document.createElement("a");
          const filename = originalFileName ? originalFileName : DCN; // 设置文件名称
          aElement.href = blobUrl; // 设置a标签路径
          aElement.download = filename;
          aElement.click();
          window.URL.revokeObjectURL(blobUrl);
        } else { //view
          var link = document.createElement('a');
          link.href = blobUrl;
          link.target = "_blank";
          link.click();
        }

前提是res能拿到对应的流,之前莫名其妙的是这种方式可以的,后来不知道哪里动了代码,导致res获取不到,原因是umi的fetch的封装问题导致的

2、后面采用ajax可以获取,但是ajax因为无法判断是否成功问题,进的是error函数,且页面空白,不可取

3、因只有两个地方用到,所以用原生的XMLHttpRequest实现

封装请求:

//预览的请求
export const previewXHR = (url, callback) => {
  let xhr = new XMLHttpRequest()
  xhr.open('GET', url, true)
  xhr.responseType = 'blob'
  xhr.onload = function () {
    callback(this)
  }
  xhr.send()
}

页面调用:

  //公告预览
  const previewNotice = (item) => {
    let { fileType, DCN, originalFileName, size } = item?.submissionInfo[0];
    const xhrUrl = `${PATH}/news/downloadkNotice?dcn=${DCN}&size=${size}&fileName=${originalFileName}&fileType=${fileType}`;
    setLoadingListState(true);
    previewXHR(xhrUrl, function (data) {
      if (data.status == 200) {
        setLoadingListState(false);
        let documentType = mimeType(fileType);
        let blob = new Blob([data.response], { type: documentType + ';chartset=UTF-8' });
        let fileURL = URL.createObjectURL(blob)
        window.open(fileURL)
      }
    })
  }

ok,一切大功告成!

附上axios方式实现预览:

axios({
        methods: 'GET',
        url: `${PATH}/news/downloadkNotice?dcn=${DCN}&size=${size}&fileName=${originalFileName}&fileType=${fileType}`,
        responseType: 'blob'
      }).then(res => {
         let documentType = mimeType(fileType);
        let blob = new Blob([data.response], { type: documentType + ';chartset=UTF-8' });
        let fileURL = URL.createObjectURL(blob)
        window.open(fileURL)
})

附上对应下载的实现方式:

  //文件下载a标签的src
  const getFileSrc = (item) => {
    let { fileType, DCN, originalFileName, size } = item?.submissionInfo[0];
    const oa = document.createElement('a');
    oa.href = `${PATH}/news/downloadkNotice?dcn=${DCN}&size=${size}&fileName=${originalFileName}&fileType=${fileType}`;
    oa.setAttribute('target', '_blank');
    document.body.appendChild(oa);
    oa.click();
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值