使用访存下载大文件,但使用了过多的缓存

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

tl; dr:有什么方法可以优化此功能以更好地处理非常大的文件的下载吗?

我正在使用javascript构建这个简单的网络应用,用户可以在其中下载多种类型的文件。通常,这些文件是.cpio存档,.mov或只是包含xyz其他文件的文件夹。

我正在使用的api(Synology)下载文件准确了解了文件头中返回的内容(应用程序/ zip,mov,zip等),因此每种文件的格式都很好,即使文件夹被自动压缩压缩。

我的问题是,有时这些文件的重量会超过1GB,现在发生的事情是,首先将所有内容加载到RAM,然后再进行下载。对于非常大的文件(> 2-3 GB),这将成为真正的系统负担。

我需要找到一种绕过缓存的方法,现在,我在请求标头中包含的所有内容都无济于事。

这是我的donwnload函数:

fetch(downloadURL, {
        method: "GET",
        mode: "cors",
        cache: 'no-store',
        headers: {
            'pragma': 'no-cache',
            'cache-control': 'no-store'
        },
    })
    .then(response => {
        return response.blob();
    })
    .then(blob => {
        console.log(blob);

        var url = URL.createObjectURL(blob);
        const a = document.createElement('a');
        a.style.display = 'none';
        a.href = url;
        a.download = filename;
        document.body.appendChild(a);
        a.click();
        window.URL.revokeObjectURL(url);
    })
    .catch(error => {
        console.log(error)
    });

这是API在响应标头中返回的内容:

Accept-Ranges: none
Connexion: Keep-alive
Content-Type: application/zip
Date: Mon, 21 Oct 2019 09:00:00 GMT
Keep-Alive: timeout=5, max=100
Server: ngix
Transfer-Encoding: chunked
javascript api download blob fetch
1个回答
0
投票

这是解决我的问题的方法。最后,我想我过多地专注于使用访存。我意识到我可以使用API​​查询网址通过与Google Chrome兼容的download属性来启动下载。

    var link = document.createElement("a");
    link.download = name;
    link.href = uri;
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
    delete link;

更简单,没有缓存。

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