1

我们目前有一个小型网络应用程序,其中一部分是文件上传。目前我们在客户端上使用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响应中的每个块,然后存储这些客户端。我不确定是否有办法知道最后一个块何时上传,以便我可以发送所有这些PartETags。如果没有,我只需要每次发送所有我拥有的,然后只有最后一个请求会使用它们。这一切对我来说似乎有点骇人听闻。

所以,我认为之前必须有人处理过这个问题。有没有一种好的、标准的方法来做到这一点?

我考虑过在应用服务器上构建文件,然后将其发送到 S3,但是对于多个应用服务器,不能保证这些块最终会出现在同一个地方。

我的另一个想法是在上传期间将所有这些信息存储在数据库中,但我不确定我是否必须在每个块请求中访问数据库。除了这个还有其他选择吗?

我感谢任何人可以提供的任何帮助。

4

2 回答 2

1

试试我们的IaaS解决方案:

https://uploadcare.com

它支持最大 5GB 的文件大小。这是一篇关于使用我们的系统上传大文件的成功用例的文章:

https://community.skuidify.com/skuid/topics/how_to_upload_large_files_using_uploadcare_com

于 2014-12-04T22:39:44.570 回答
0

如果我错了,请纠正我,但据我了解您的问题,您的网络服务器充当浏览器和客户端之间的代理。

我遇到的问题是我需要以某种方式知道块的uploadId。当我从上传的初始化中获得 InitiateMultipartUploadResult 时,我就有了它,但是我如何将它与后来出现的块相关联?

BeforeUpload您可以添加uploadIdas querystring 参数,如this answer

我的第一个想法是我可以在响应中发送每个块的 PartETag,然后存储这些客户端。

这似乎是个好主意,然后像上面那样在“ChunkUploaded”上更改查询字符串以添加刚刚收到的内容PartETag,从而传输PartETag每个请求之前收到的所有内容。不确定是否可以更改块之间的查询字符串,或者您是否可以在开始上传下一个块之前同步进行一些处理,但我会说值得一试。

我不确定是否有办法知道最后一个块何时上传,以便我可以发送所有这些 PartETag。

这可以在 plupload 下载的 php 示例中找到:两个 POST 参数由 plupload 发送到服务器

  • chunks:上传的总块数(如果上传未分块,则为 0)
  • chunk : 正在上传的当前块的索引

最后一块是什么时候chunks==0 || chunk==chunks-1

于 2013-11-26T14:54:22.213 回答