我正在尝试使用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校验和与服务器不同,则重新下载文件并重新检查,但对于互联网连接非常有限的用户来说,这又是一种数据浪费。
1条答案
按热度按时间k97glaaz1#
正如marc所说,没有常见的原因,你的文件被损坏
"但是"
我在想,也许我可以检查下载文件的MD5校验和,并将其与服务器上的文件进行比较。但这样就足够了吗?
对我来说就是你问题的书面答案。
如果MD5校验和与服务器不同,则重新下载文件并重新检查,但对于互联网连接非常有限的用户来说,这又是一种数据浪费。
嗯,你可以把你的文件分成几块。
如果您有大文件要传输(例如〉1Gb),您可以将其拆分为100Mb的块并逐个传输,然后单独检查校验和,然后将它们连接起来并再次检查完整的校验和。
例如:
1.请求下载到服务器,服务器通过给出文件的数量或最终文件的大小来响应
1.在第一次文件下载请求时,将1Gb文件拆分为10个文件,存放在服务器上的tmp文件夹中。
1.每次下载后,检查此单个部分的校验和。
1.下载完所有部分后,将它们连接起来(可能使用
Buffer.from(fileParts)
)并验证最终校验和这只是一个快速的想法,一个潜在的解决方案,您的问题。
希望对你有帮助。