JavaScript 如何确保下载的文件成功且未损坏

分享于2022年07月17日 electron javascript node.js 问答
【问题标题】:JavaScript 如何确保下载的文件成功且未损坏(JavaScript how can I make sure the downloaded file is successful and not corrupted)
【发布时间】:2022-01-05 04:53:41
【问题描述】:

我正在玩 Electron-Node.js ,我正在尝试从服务器下载文件并将其保存到本地磁盘中。

下面的代码按预期工作,但我不确定这是否是最好的方法。


WhatIF 来了;

我用 50MB 的文件大小对其进行了测试,它可以工作,文件是健康的。但是如果文件大小超过 200MB 或者假设是 large file 并且用户只有非常有限的互联网连接怎么办?文件可能会损坏,如何避免这种情况?我们如何检查或确保文件已成功下载且未损坏?

我在想,也许我可以检查下载文件的 MD5 校验和,并将其与来自服务器的文件进行比较。但这够了吗?

如果 MD5 校验和与服务器不同,则重新下载文件并重新检查,但对于互联网连接非常有限的用户来说,这又会浪费数据。

  • "文件可能已损坏" 您为什么这么认为?缓慢的互联网连接不会损坏您的文件/数据。即使 iternet 连接被切断,或者下载停止,也会抛出错误。 ESOCKETHANGUP 。网络速度与文件/数据的完整性无关。

【解决方案1】:

正如 marc 所说,您的文件损坏没有常见原因

但是

我在想,也许我可以检查下载文件的 MD5 校验和,并将其与来自服务器的文件进行比较。但这够了吗?

对我来说是你自己问题的书面答案。

那么

如果 MD5 校验和与服务器不同,则重新下载文件并重新检查,但对于互联网连接非常有限的用户来说,这又会浪费数据。

嗯,你可以把你的文件分成几块。

如果您要传输大文件(例如 > 1Gb),您可以将其拆分为 100Mb 的块并逐个传输,并单独检查校验和,然后将它们连接起来并再次检查完整的校验和。

例如:

  1. 请求下载到服务器,服务器通过给出文件的数量或最终文件的大小来响应
  2. 在第一个文件下载请求时,将 1Gb 文件拆分为服务器上 tmp 文件夹中的 10 个文件。
  3. 每次下载后,检查这部分的校验和。
  • 如果校验和错误,只能重新下载这部分
  1. 下载所有部分后,连接它们(可能与 Buffer.from(fileParts) 并验证最终校验和

这只是对您问题的潜在解决方案的快速思考。

希望对你有所帮助。