处理照片和视频的大型网络上传

handling large web uploads for photo and videos

我的用例涉及使用浏览器将数千张完整质量的照片和视频文件上传到 S3 和 Wasabi 存储帐户。目前我们正在客户端的浏览器上压缩它,现在我们使用处理上传的 dropzonejs 来完成它。现在在上传到服务器之前对其进行压缩。

然而,这正是我们需要改变的。我们需要上传原始质量的照片,这就是它卡住的地方,因为我们无法使用 Dropzonejs 上传超过 3-4 Gbs 的文件。不确定是什么阻止了它,但我们正在努力寻找解决方案。我们在 Chrome 中随机遇到内存限制问题,它崩溃并需要重新启动进程。对于原始质量的照片,我们假设这不会起作用,因为我们将至少讨论至少 10 到 15 gbs 的数据。

对于这种我们需要以原始质量上传视频和照片的用例,有时单张照片可能需要 40Mbs+,您有什么建议。和视频几个 Gbs。

Google photos 如何管理这个?我们需要这样的东西。

分块...

有人已经有演示 https://github.com/dropzone/dropzone/blob/main/test/test-sites/2-integrations/aws-s3-multipart.html

但是,我认为 4GB 是 Chrome 可接受的最大文件大小(而且我认为 chrome 与其他浏览器相比具有最高限制)。这意味着您需要使用其他方法上传,例如 ftp、stream、scp 等...或者要求您的客户在通过浏览器上传之前自行对文件进行切片。

或者创建一个与 S3 客户端捆绑在一起的自定义可执行文件,让您的客户端使用它

dropzonejs 支持 chunkingparalleling 你用过吗? 您是否像这样通过 dropzone 压缩文件:

不要在客户端压缩。它实际上增加了浏览器会话的内存使用量。根据我的经验,从浏览器上传原始图片使用的内存最少,因为浏览器应该只从文件中读取足够的内存来发送数据,只要您不在本地加载图片以显示缩略图。

我能够在关闭客户端压缩的情况下将 GB 的图像上传到 S3。我能够将一个 20GB 的视频文件上传到 S3,使用 S3 块上传上传 200 个视频,总计超过 13GB。块上传应该增加,而不是减少浏览器内存使用,并且实现了大文件的手动传输失败。

您可以编写客户端以通过提供签名 url(s) 直接上传到 S3 并让它们作为中间人跳过服务器来获得巨大的性能提升:

S3: https://docs.aws.amazon.com/AmazonS3/latest/userguide/PresignedUrlUploadObject.html

GCP: https://cloud.google.com/blog/products/storage-data-transfer/uploading-images-directly-to-cloud-storage-by-using-signed-url

我建议使用 S3 中的预签名 url。在我们的项目中,我们通过提供存储桶名称、路径名称、存储桶上传权限和到期时间来生成预签名 url。所以现在用户可以轻松地将文件直接上传到 S3。 AWS 会处理所有的网络问题,唯一的条件是你应该有一个良好的互联网。