将大文件分块下载到硬盘

问题描述 投票:0回答:1

我有这个方法来下载文件。但我希望能够下载超过 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 预定义的方法

javascript angular promise
1个回答
0
投票

所以,解决方案是使用这个 https://developer.mozilla.org/en-US/docs/Web/API/File_System_API

是的,它不支持所有浏览器,因此,如果当前客户端不支持它,我会显示警报,它将使用 RAM 来执行此过程,并按照我之前的方式进行操作

© www.soinside.com 2019 - 2024. All rights reserved.