JS 实现前端下载

下载文件,是一个常见的业务需求。主要是依靠 <a href='' download> 下载 </a>

1. 介绍


  • 语法
      <a href="demo.txt" download="filename">下载</a>
    
  • 属性
属性 介绍
download 规定作为文件名来使用的文本。如果定义后,则该值为下载的文件名;不定义则自动从 href 属性中自动取值命名






2. JS 实现 download


  • 整体思路
    手动生成 <a> 标签,为它添加hrefdownload属性,触发 click 事件。从而实现下载。
  • download 代码示例
    const dowmloadWithBlob = (blob) => {
      const fileName = 'demo.xml';
      const msSaveBlob = _.get(window, 'navigator.msSaveBlob');
      if (msSaveBlob) {
        // compatible with IE
        msSaveBlob(blob, fileName);
      } else {
        // compatible with Chrome & FireFox
        const linkElement = document.createElement('a');
        linkElement.download = fileName;
        linkElement.href = window.URL.createObjectURL(blob);
        linkElement.click();
        window.URL.revokeObjectURL(linkElement.href);
      }
    };
    
  • blob 流

    至于这个 blob 流的获取,目前我接触到的,应该是两种形式吧:
    1> 从服务器端获取,在将它转为 blob 流

     fetch('//api.demo')
       .then((res) => res.blob())
       .then((blob) => {
         dowmloadWithBlob(blob);
       });
    

    2> 从具体的 base64 转为 blob 流

      interface IProps {
        base64Data: string;
        contentType?: string;
        sliceSize?: number;
      }
     export default (props: IProps) => {
      const { base64Data, contentType = '', sliceSize = 512 } = props;
    
      const byteCharacters = atob(base64Data);
      const byteArrays = [];
    
      for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) {
        const slice = byteCharacters.slice(offset, offset + sliceSize);
        const byteNumbers = new Array(slice.length);
        for (let i = 0; i < slice.length; i++) {
          byteNumbers[i] = slice.charCodeAt(i);
        }
    
      const byteArray = new Uint8Array(byteNumbers);
      byteArrays.push(byteArray);
      }
      
      const blob = new Blob(byteArrays, { type: contentType });
      return blob;
    };
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。