• js 文件下载功能


    import { message } from 'antd'

    export function getBlob(url: string): Promise<any> {
      return new Promise(resolve => {
        const xhr = new XMLHttpRequest()
        xhr.open('GET', url, true)
        xhr.setRequestHeader('Authorization', window.localStorage.getItem('token'))
        xhr.responseType = 'blob'
        message.loading('', 0)
        xhr.onload = () => {
          message.destroy()
          if (xhr.status === 200) {
            if (xhr.response.type == 'application/json') {
              var reader = new FileReader()
              reader.addEventListener('loadend', function (e) {
                let res = JSON.parse(e.target.result as any)
                if (res?.code != 200) {
                  message.error(res.message)
                }
              })
              reader.readAsText(xhr.response)
              return
            }
            resolve({
              blob: xhr.response,
              fileName: getFileName(xhr),
            })
          }
        }
        xhr.send()
      })
    }

    function getFileName(xhr) {
      var filename = ''
      var disposition = xhr.getResponseHeader('Content-Disposition')
      if (disposition && disposition.indexOf('attachment') !== -1) {
        var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/
        var matches = filenameRegex.exec(disposition)
        if (matches != null && matches[1]) {
          filename = matches[1].replace(/['"]/g, '')
        }
      }
      return filename
    }

    export function saveBlob(
      blob: Blob,
      blobFileName?: string,
      filename?: string
    ): void {
      // eslint-disable-next-line @typescript-eslint/ban-ts-comment
      // @ts-ignore
      if (window.navigator.msSaveOrOpenBlob) {
        ;(window.navigator as any).msSaveBlob(blob, filename)
      } else {
        const link = document.createElement('a')
        const body: HTMLBodyElement = document.querySelector(
          'body'
        ) as HTMLBodyElement
        link.href = window.URL.createObjectURL(blob)
        if (filename) {
          if (blobFileName) {
            link.download = filename + '.' + blobFileName.split('.').pop()
          }
        } else {
          link.download = blobFileName ? decodeURI(blobFileName) : null
        }
        link.style.display = 'none'
        body.appendChild(link)
        link.click()
        body.removeChild(link)
        window.URL.revokeObjectURL(link.href)
      }
    }

    export const downloadFile = async (url: string, filename?: string) => {
      if (!url) return
      const blobFile = await getBlob(url)
      saveBlob(blobFile.blob, blobFile.fileName, filename)
    }
  • 相关阅读:
    Android SDK Android NDK 官方下载地址
    编码转换工具 源码
    st_mode的剖析
    关于 python 字符编码的一些认识
    MFC中的argc和argv参数
    VC实现文件拖拽获取文件名
    CString 转 int
    《C语言程序设计实践教程》实验题源程序
    C语言 文件操作 结构体与文件 fgetc fputc fread fwrite
    C++语言 创建状态栏
  • 原文地址:https://www.cnblogs.com/llcdbk/p/16531705.html
Copyright © 2020-2023  润新知