我们目前有一个小型网络应用程序,其中一部分是文件上传。目前我们在客户端上使用Plupload并启用分块以允许上传大文件。文件保存在应用服务器上,并且在出现时附加块。
现在,我们正在迁移到Amazon S3进行文件存储,并可以使用多个应用服务器。我发现如何处理这些块很困难。我试图效仿他们的榜样,但遇到了问题。我正在尝试的肉看起来像这样:
UploadPartRequest uploadRequest = new UploadPartRequest()
.withBucketName(bucket).withKey(key)
.withUploadId(uploadId).withPartNumber(partNumber)
.withPartSize(bytes.length)
.withInputStream(new ByteArrayInputStream(bytes));
s3Client.uploadPart(uploadRequest);
我遇到的问题是我需要以某种方式知道块的uploadId。当我InitiateMultipartUploadResult
从上传的初始化中得到它时,我有它,但我如何将它与后来出现的块相关联?我想我也许可以在第一个响应时将其发送出去,然后在每个块请求时将其发送回来。这似乎不是太遥不可及。
然后我发现,为了完成上传,我需要 a从每次上传到 Amazon S3List<PartETag>
的s 中返回。PartETag
那么,我的下一个问题是如何在PartETag
从浏览器上传块时保存所有这些 s?我的第一个想法是我可以发送PartETag
响应中的每个块,然后存储这些客户端。我不确定是否有办法知道最后一个块何时上传,以便我可以发送所有这些PartETag
s。如果没有,我只需要每次发送所有我拥有的,然后只有最后一个请求会使用它们。这一切对我来说似乎有点骇人听闻。
所以,我认为之前必须有人处理过这个问题。有没有一种好的、标准的方法来做到这一点?
我考虑过在应用服务器上构建文件,然后将其发送到 S3,但是对于多个应用服务器,不能保证这些块最终会出现在同一个地方。
我的另一个想法是在上传期间将所有这些信息存储在数据库中,但我不确定我是否必须在每个块请求中访问数据库。除了这个还有其他选择吗?
我感谢任何人可以提供的任何帮助。