Home > sculp-js > crossOriginDownload
crossOriginDownload() function
下载跨域资源并触发浏览器保存,支持请求头、XHR 进度和取消。
Signature:
typescript
export declare function crossOriginDownload(url: string, filename: string, options?: CrossOriginDownloadParams): Promise<void>;Parameters
Parameter | Type | Description |
|---|---|---|
url | string | GET 请求地址,服务端必须允许 CORS。 |
filename | string | 保存时建议使用的文件名。 |
options | (Optional) 可选配置;默认 auto,无进度回调时优先 fetch。 |
Returns:
Promise<void>
触发保存并清理临时资源后兑现的 Promise。 下载失败时以 CrossOriginDownloadError 拒绝;onProgress 抛错时以原异常拒绝。
Remarks
文件完整接收为 Blob 后触发保存;进度完成或 Promise 兑现均不表示已写入磁盘。 使用 await 或 then/catch 处理结果,不再支持成功、失败回调。
Example 1
基础下载并处理失败:
ts
import { crossOriginDownload } from 'sculp-js/download';
try {
await crossOriginDownload('/api/export', 'report.xlsx');
} catch (error) {
console.error('下载失败', error);
}Example 2
鉴权与进度,auto 自动使用 XHR,总量未知时展示已接收字节数:
ts
import { crossOriginDownload } from 'sculp-js/download';
try {
await crossOriginDownload('/api/export', 'report.xlsx', {
headers: { Authorization: 'Bearer YOUR_TOKEN' },
onProgress({ loaded, percent, done }) {
if (done) console.log('接收完成,准备保存');
else if (percent !== undefined) console.log(`已下载 ${percent.toFixed(1)}%`);
else console.log(`已接收 ${loaded} 字节`);
}
});
} catch (error) {
console.error('下载失败', error);
}Example 3
用户取消;触发浏览器保存后 abort 无效:
ts
import { crossOriginDownload, CrossOriginDownloadError } from 'sculp-js/download';
const controller = new AbortController();
const cancelButton = document.querySelector<HTMLButtonElement>('#cancel-download');
const cancel = () => controller.abort();
cancelButton?.addEventListener('click', cancel);
try {
await crossOriginDownload('/api/export', 'report.xlsx', { signal: controller.signal });
} catch (error) {
if (error instanceof CrossOriginDownloadError && error.code === 'ABORTED') {
console.log('下载已取消');
} else {
console.error('下载失败', error);
}
} finally {
cancelButton?.removeEventListener('click', cancel);
}Example 4
通过 Promise 链处理成功和失败:
ts
import { crossOriginDownload } from 'sculp-js/download';
crossOriginDownload('/api/export', 'report.xlsx')
.then(() => console.log('已触发保存'))
.catch(error => console.error('下载失败', error));