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)
}
积累小的知识,才能成就大的智慧,希望网上少一些复制多一些原创有用的答案
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
2016-07-29 cookie和session是否可以保存对象