我有这个方法来下载文件。但我希望能够下载超过 1GB 的文件。是否可以这样做并逐块下载它,因为对我来说,在客户端内存中存储这么多数据真的很糟糕。
const list = this.selectionService.getListValue();
const areAllSelected = this.selectionService.getIsAllSelectedValue();
const link = document.createElement('a');
this.loadingText = 'Exporting images...';
this.showLoading = true;
this.absolutePosition = true;
await this.projectImagesService
.downloadFilteredZip(event.imageSetId, list, areAllSelected)
.then(response => {
const contentDisposition = response.headers.get('Content-Disposition');
const filename = contentDisposition
? contentDisposition.split('filename=')[1]
: `image_set_${event.imageSetId}_${Date.now()}.zip`;
const href = window.URL.createObjectURL(response.body);
link.download = filename;
link.href = href;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
this.showLoading = false;
this.absolutePosition = false;
this.loadingText = 'Uploading...';
});
}
这就是 downloadFilteredZip 中发生的情况
downloadFilteredZip(imageSetId: number, list: Array<string | number>, allSelected: boolean) {
const offsetFilters = this.getOffsetFilters();
const areAllSelected = list.includes('all');
const url = `image-sets/${imageSetId}/archive?${this.serverApiService.rebuildObjectToQuery({
...this.filters,
...(!areAllSelected && offsetFilters),
...(!areAllSelected && !allSelected && { ids: list }),
})}`;
return this.serverApiService.get<Blob>(url, { responseType: 'blob' });
}
}
我正在使用 Angular,但我受到团队的一些限制,所以我必须使用 serverApiService 预定义的方法
所以,解决方案是使用这个 https://developer.mozilla.org/en-US/docs/Web/API/File_System_API
是的,它不支持所有浏览器,因此,如果当前客户端不支持它,我会显示警报,它将使用 RAM 来执行此过程,并按照我之前的方式进行操作