文件下载示例 >> 各类函数封装
import { openWindow } from '..';
import { dataURLtoBlob, urlToBase64 } from './base64Conver';
/**
* Download online pictures
* @param url
* @param filename
* @param mime
* @param bom
*/
// 图片Url下载,如果有跨域问题,需要处理图片跨域
export function downloadByOnlineUrl(url: string, filename: string, mime?: string, bom?: BlobPart) {
urlToBase64(url).then((base64) => {
downloadByBase64(base64, filename, mime, bom);
});
}
/**
* Download pictures based on base64
* @param buf
* @param filename
* @param mime
* @param bom
*/
// 导出 base 64 格式 图片
export function downloadByBase64(buf: string, filename: string, mime?: string, bom?: BlobPart) {
const base64Buf = dataURLtoBlob(buf);
downloadByData(base64Buf, filename, mime, bom);
}
/**
* Download according to the background interface file stream
* @param {*} data
* @param {*} filename
* @param {*} mime
* @param {*} bom
*/
// 根据后台接口文件流下载 >> 文件流下载 可用于 post blod 下载
export function downloadByData(data: BlobPart, filename: string, mime?: string, bom?: BlobPart) {
const blobData = typeof bom !== 'undefined' ? [bom, data] : [data];
const blob = new Blob(blobData, { type: mime || 'application/octet-stream' });
const blobURL = window.URL.createObjectURL(blob);
const tempLink = document.createElement('a');
tempLink.style.display = 'none';
tempLink.href = blobURL;
tempLink.setAttribute('download', filename);
if (typeof tempLink.download === 'undefined') {
tempLink.setAttribute('target', '_blank');
}
document.body.appendChild(tempLink);
tempLink.click();
document.body.removeChild(tempLink);
window.URL.revokeObjectURL(blobURL);
}
/**
* Download file according to file address
* @param {*} sUrl
*/
// 根据文件地址下载文件 >> 文件地址下载
export function downloadByUrl({
url,
target = '_blank',
fileName,
}: {
url: string;
target?: TargetContext;
fileName?: string;
}): boolean {
const isChrome = window.navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
const isSafari = window.navigator.userAgent.toLowerCase().indexOf('safari') > -1;
if (/(iP)/g.test(window.navigator.userAgent)) {
console.error('Your browser does not support download!');
return false;
}
if (isChrome || isSafari) {
const link = document.createElement('a');
link.href = url;
link.target = target;
if (link.download !== undefined) {
link.download = fileName || url.substring(url.lastIndexOf('/') + 1, url.length);
}
if (document.createEvent) {
const e = document.createEvent('MouseEvents');
e.initEvent('click', true, true);
link.dispatchEvent(e);
return true;
}
}
if (url.indexOf('?') === -1) {
url += '?download';
}
// 利用 window.open get的方式下载文件
// 该方法不能用于 post blod 下载方式
openWindow(url, { target });
return true;
}
base64Conver.ts文件
/**
* @description: base64 to blob
*/
export function dataURLtoBlob(base64Buf: string): Blob {
const arr = base64Buf.split(',');
const typeItem = arr[0];
const mime = typeItem.match(/:(.*?);/)![1];
const bstr = window.atob(arr[1]);
let n = bstr.length;
const u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], { type: mime });
}
/**
* img url to base64
* @param url
*/
export function urlToBase64(url: string, mineType?: string): Promise<string> {
return new Promise((resolve, reject) => {
let canvas = document.createElement('CANVAS') as Nullable<HTMLCanvasElement>;
const ctx = canvas!.getContext('2d');
const img = new Image();
img.crossOrigin = '';
img.onload = function () {
if (!canvas || !ctx) {
return reject();
}
canvas.height = img.height;
canvas.width = img.width;
ctx.drawImage(img, 0, 0);
const dataURL = canvas.toDataURL(mineType || 'image/png');
canvas = null;
resolve(dataURL);
};
img.src = url;
});
}
允许多个文件下载
/**
* @description 通过文件地址转blob下载 允许下载多个文件
* @param {string} url 文件地址
* @param {string} fileName 文件名
*/
export async function downloadFileUrlToBlob(url: string, fileName: string) {
const xml = new XMLHttpRequest();
xml.open("GET", url, true);
xml.responseType = "blob";
xml.onload = function () {
const r_url = window.URL.createObjectURL(xml.response);
const a = document.createElement("a");
a.href = r_url;
a.download = fileName;
// 使用a标签批量下载文件时最好使用_blank,否则只会下载最后一个文件
a.setAttribute("target", "_blank");
a.click();
a.remove();
};
xml.send();
}
使用案例
<Button
type="link"
onClick={() => {
const files = v.split(",");
files.forEach((file, index) => {
downloadFileUrlToBlob(files[index], `发票${index + 1}`);
});
}}
>
下载
</Button>