【发布时间】:2023-03-23 19:36:01
【问题描述】:
我们目前有一个小型网络应用程序,其中一部分是文件上传。目前我们在客户端上使用Plupload 启用分块以允许上传大文件。文件保存在应用服务器上,并在出现时附加块。
现在我们将转移到Amazon S3 进行文件存储,并可以使用多个应用服务器。我发现如何处理这些块很困难。我试图关注their example,但我遇到了问题。我正在尝试的内容如下所示:
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucket).withKey(key)
.withUploadId(uploadId).withPartNumber(partNumber)
.withPartSize(bytes.length)
.withInputStream(new ByteArrayInputStream(bytes));
s3Client.uploadPart(uploadRequest);
我遇到的问题是我需要以某种方式知道块的uploadId。当我从上传初始化中获得InitiateMultipartUploadResult 时,我就有了它,但是我如何将它与后来出现的块相关联?我想我也许可以在第一个响应时将其发送出去,然后在每个块请求时将其发送回来。这似乎并不遥不可及。
然后我发现,为了完成上传,我需要一个 List<PartETag>,每次上传到 Amazon S3 时都会返回 PartETags。那么,我的下一个问题是如何在从浏览器上传块时保存所有这些PartETags?我的第一个想法是我可以在响应中发送每个块的PartETag,然后存储这些客户端。我不确定是否有办法知道最后一个块何时上传,以便我可以发送所有这些PartETags。如果没有,我只需要每次发送所有我拥有的,然后只有最后一个请求会使用它们。这一切对我来说似乎有点 hacky。
所以,我认为之前必须有人处理过这个问题。有没有一种好的、标准的方法来做到这一点?
我考虑过在应用服务器上构建文件,然后将其发送到 S3,但是对于多个应用服务器,不能保证这些块最终会在同一个位置。
我的另一个想法是在上传期间将所有这些信息存储在数据库中,但我不确定我是否必须在每个块请求中访问数据库。除此之外还有其他选择吗?
感谢任何人提供的任何帮助。
【问题讨论】:
标签: java file-upload amazon-s3 plupload large-file-upload