electron JavaScript如何确保下载的文件是成功的,而不是损坏

egdjgwm8  于 2023-02-17  发布在  Electron
关注(0)|答案(1)|浏览(217)

我正在尝试使用Electron-Node.js,并尝试从服务器下载一个文件并将其保存到本地磁盘中。
下面的代码按预期工作,尽管我不确定这是否是最好的方法。

<script>
    const { ipcRenderer } = require('electron');
    var fs = require('fs');

    // (2) convert the blob to file.
    async function saveBlobToFile(blob, filename) {
        let fileData = new Int8Array(await blob.arrayBuffer());
        fs.writeFileSync(filename, fileData);
        console.log("Blob successfully saved to file.");
        //is the file healthy though?
    }

    // (1) (download the file)
    function download(downloadURL, downloadDirectory){
        var filename = "test.zip"; //this could be exe, images, pdf
        if (!fs.existsSync(downloadDirectory)){ 
            fs.mkdirSync(downloadDirectory, { recursive: true });
            console.log("Download Directory doesn't exist, created.");
        }
        console.log("Downloading...");
        fetch(downloadURL)
            .then(response => response.blob())
            .then(blob => {
                console.log("Downloaded and is now saving...");
                saveBlobToFile(blob, downloadDirectory+"\\"+filename);
            }).catch(console.error);
    }
        
    download("https://sample.com/test.zip", "SOME_DIRECTORY_HERE"); //let's try to download the file.
</script>

接下来是假设;
我用50MB的文件大小测试它,它工作正常,文件是健康的。但是如果文件大小超过200MB,或者说large file,而用户只有非常有限的互联网连接,该怎么办?文件可能会损坏,如何避免这种情况?我们如何检查或确保文件成功下载,而不是损坏?
我在想,也许我可以检查下载文件的MD5校验和,并将其与服务器上的文件进行比较。但这样就足够了吗?
如果MD5校验和与服务器不同,则重新下载文件并重新检查,但对于互联网连接非常有限的用户来说,这又是一种数据浪费。

k97glaaz

k97glaaz1#

正如marc所说,没有常见的原因,你的文件被损坏
"但是"
我在想,也许我可以检查下载文件的MD5校验和,并将其与服务器上的文件进行比较。但这样就足够了吗?
对我来说就是你问题的书面答案。

    • 那么**

如果MD5校验和与服务器不同,则重新下载文件并重新检查,但对于互联网连接非常有限的用户来说,这又是一种数据浪费。
嗯,你可以把你的文件分成几块。
如果您有大文件要传输(例如〉1Gb),您可以将其拆分为100Mb的块并逐个传输,然后单独检查校验和,然后将它们连接起来并再次检查完整的校验和。
例如:
1.请求下载到服务器,服务器通过给出文件的数量或最终文件的大小来响应
1.在第一次文件下载请求时,将1Gb文件拆分为10个文件,存放在服务器上的tmp文件夹中。
1.每次下载后,检查此单个部分的校验和。

  • 如果校验和错误,只需重新下载此部分

1.下载完所有部分后,将它们连接起来(可能使用Buffer.from(fileParts))并验证最终校验和
这只是一个快速的想法,一个潜在的解决方案,您的问题。
希望对你有帮助。

相关问题