2

我有一个 Rails 应用程序,它使用元数据和 wav 文件对录制的音乐产品进行分类。

以前,我的用户可以选择通过 ftp 向我发送文件,我将使用 cron 任务监视新的 .complete 文件,然后选择它的关联 .xml 文件并执行元数据导入和音频文件传输到 S3。

我经常遇到先前 FTP 的容量限制,因此决定将用户“保管箱”移动到 S3,并使用 FTP 网关允许用户向我发送他们的文件。现在它在 S3 上,由于 S3 没有将对象存储在文件夹中,我正在努力弄清楚如何导航存储桶,找到 .complete 文件,然后像往常一样执行我的导入。

无论如何可以推荐如何“扫描”存储桶以获取新的 .complete 文件.....读取文件名,然后传回我的应用程序,以便我可以获取它的 xml、wav 和 jpg 文件?

我存储桶中的文件结构是这样的。如您所见,这里有两种产品。我需要找到两者并导入它们关联的 xml 数据和 wavs/jpg

42093156-5060156655634/
42093156-5060156655634/5060156655634.complete
42093156-5060156655634/5060156655634.jpg
42093156-5060156655634/5060156655634.xml
42093156-5060156655634/5060156655634_1_01_wav.wav
42093156-5060156655634/5060156655634_1_02_wav.wav
42093156-5060156655634/5060156655634_1_03_wav.wav
42093156-5060156655634/5060156655634_1_04_wav.wav
42093156-5060156655634/5060156655634_1_05_wav.wav
42093156-5060156655634/5060156655634_1_06_wav.wav
42093156-5060156655634/5060156655634_1_07_wav.wav
42093156-5060156655634/5060156655634_1_08_wav.wav
42093156-5060156655634/5060156655634_1_09_wav.wav
42093156-5060156655634/5060156655634_1_10_wav.wav
42093156-5060156655634/5060156655634_1_11_wav.wav
42093163-5060243322593/
42093163-5060243322593/5060243322593.complete
42093163-5060243322593/5060243322593.jpg
42093163-5060243322593/5060243322593.xml
42093163-5060243322593/5060243322593_1_01_wav.wav
4

1 回答 1

2

虽然 Amazon S3 正式没有文件夹的概念,但您实际上可以通过GET Bucket API使用delimiterprefix参数来模拟文件夹。您将获得类似于您在 AWS 管理控制台界面中看到的结果。

使用它,您可以列出顶级目录,并扫描它们。找到顶级目录的名称后,您可以更改参数并发出新的 GET Bucket 请求,列出“目录”内的“文件”,并检查.complete文件是否存在以及您.xml和其他人相关文件。

但是,您的问题可能有不同的方法:您是否考虑使用SQS?您可以让接收上传的进程将消息发布到 SQS 中的队列,例如completed-uploads,并使用刚刚完成的上传文件夹的名称。然后另一个进程将消耗队列并处理完成的上传。无需扫描 S3 中的目录。

请注意,如果您尝试使用 SQS 方法,您可能需要为上传完成后收到多次通知的可能性做好准备:SQS 保证最终将至少发送一次已发布的消息;您可能会收到重复的消息!(您可以通过将接收到的消息的 id 保存在一致的数据库上,并根据同一数据库检查新接收到的消息来识别重复的消息)。

另外,请记住,如果您使用 S3 的美国标准区域,那么您没有 read-after-write 一致性,您只有最终一致性,这意味着从 SQS 接收消息的进程可能会尝试 GET 对象从 S3 并没有得到任何回报 - 再试一次,直到它看到对象。

于 2013-06-29T21:32:26.480 回答