前端根据文件url路径判断文件预览或者下载以及自定义

需求:

点击不同附件浏览器查看效果不同,比如附近类型为pdf,则打开一个新的tab页在线预览,如果是zip包等,则直接下载,如果是image,则弹窗展示当前图片
在这里插入图片描述

如下图,服务端一般会把文件放在一个云服务上,我们无法根据当前地址判断出该文件类型

在这里插入图片描述

我们可以创造一个http请求当前地址,那么response header则会返回当前的文件类型,我们可以根据当前的文件类型再做不同的操作

代码实现

/**
 * 文件下载 或者预览
 * @param url 
 * @param fileName 
 * @param previewTypes  需要预览的文件类型  默认所有类型都是下载  请确保传入正确的MIME 类型或者MIME类型的的主要字段 比如 image/png可传入image
 * @param customTypes  需要自定义的文件类型 会返回当前文件类型  请确保传入正确的MIME 类型
 */
export const downloadOrPreviewFile = (url: string, fileName: string, previewTypes: string[] = [], customTypes: string[] = []): Promise<string> => {
   
  return new Promise<string>((resolve, reject) => {
   

    let contentType = "text/plain"
    var xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'arraybuffer';

    xhr.onload = function () {
   
      if (xhr.status === 200) {
   
        contentType = xhr.getResponseHeader('Content-type');
        //如果找不到自定义的 就走默认的下载或者预览
        const hasCustomType = customTypes.findIndex(item => contentType.includes(item)) > -1
        if (!hasCustomType) {
   
          var arrayBuffer = xhr.response;
          var blob = new Blob([arrayBuffer], {
    type: contentType });
          var link = document.createElement('a');
          link.href = window.URL.createObjectURL(blob);
          link.target = '_blank';

          //如果找不到预览  那么就下载
          const hasPreviewType = previewTypes.findIndex(item => contentType.includes(item)) > -1
          if (!hasPreviewType) {
   
            link.download = fileName;
          }
          link.dispatchEvent(new MouseEvent('click'));
        } else {
   
          resolve(contentType);
        }
      } else {
   
        reject(new Error('获取文件失败'));
      }
    };
    xhr.onerror = function () {
   
      reject(new Error('获取文件失败'));
    };
    xhr.send();
  });
}

组件使用

在这里插入图片描述

相关推荐

  1. vue 根据url下载文件

    2024-01-05 23:46:02       13 阅读
  2. 前端 文件方法汇总

    2024-01-05 23:46:02       46 阅读
  3. js下载svg文件svg文件

    2024-01-05 23:46:02       23 阅读
  4. 关于根据url下载文件之空格符报错

    2024-01-05 23:46:02       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-05 23:46:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-05 23:46:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-05 23:46:02       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-05 23:46:02       20 阅读

热门阅读

  1. 大数据领域相关术语总结

    2024-01-05 23:46:02       32 阅读
  2. 关于一个web站点的欢迎页面

    2024-01-05 23:46:02       29 阅读
  3. 基于SpringBoot的旅游网站281

    2024-01-05 23:46:02       42 阅读
  4. 复选框checkbox的三种状态

    2024-01-05 23:46:02       37 阅读
  5. linux centos7根分区扩容

    2024-01-05 23:46:02       36 阅读
  6. c++ vector数组详细介绍

    2024-01-05 23:46:02       27 阅读
  7. python virtualenv 虚拟环境命令

    2024-01-05 23:46:02       28 阅读
  8. Django(六)

    2024-01-05 23:46:02       37 阅读