如何上传文件并处理处理和验证 - 一个非常笼统的概述?

How to upload files and handle processing and validations - a very general overview?

手头的问题

  1. 我有一个 rails 应用程序。
  2. 用户将上传文件。 1 个文件到 3000 个文件之间的任何位置。有时它们是 zip 文件,有时它们不是。我不想因为这些文件上传而阻塞服务器,所以我正在寻找解决此问题的方法。
  3. 必须解压缩压缩文件。
  4. 然后我想检查是否:用户以前上传过相同的文件?即,如果用户一周前已经上传了相同的文件 (2),那么这是一个问题:(i) 要么我们不允许上传该特定文件,要么我们询问用户:你确定你想要再次上传相同的文件?
  5. 然后我想将keys/links存储到后端适当的models/records内的文件中。

想知道处理上述问题的最佳工作流程是什么:即非常笼统的概述:换句话说,AWS Lambda / Google 云计算等是否最适合用来处理上述问题?我们如何使用 Shrine gem 来最好地处理这种情况?使用 AWS Lambda 而不是使用后台作业有意义吗?

我喜欢用神社gem上传。

我的想法:

  1. 在客户端,用户拖放文件 想上传。
  2. 然后所有文件都通过 Shrine 上传(无论是否压缩)到临时存储桶位置 gem。
  3. 如果上传了 zip 文件,则可能必须触发 AWS lambda 函数来解压缩文件。如果是这种情况,那么在一天结束时,这些文件的密钥必须以某种方式 returned 到客户端,以处理验证问题——但是 AWS lambda 函数如何能够 return 这个请求发送到发起请求的原始客户端?或者更确切地说,是否应该从客户端生成 AWS lambda 函数,传入解压缩的 blob 的 ID?
  4. 然后我们需要运行一些验证:我们要处理存在重复文件的情况。我们需要检查我们的 rails 是否已经上传了这些文件。
  5. 处理完这些验证问题后,用户提交表单,所有密钥都存储在适当的记录中。

这些想法绝不是规定性的

我正在寻求一些非常普遍的建议,以了解最好的方法是什么。我绝不局限于 AWS:我可以同样轻松地使用 Google 或 Azure。如有任何关于上述内容的指导,我们将不胜感激。

具体问题:

  1. 如何触发 AWS lambda 函数?
  2. 如何才能return将上传文件的密钥返回给客户端?

一般概述是什么意思?

以下是一般概述的一些示例:

(1) Uploading & Unzipping files to S3 through Rails hosted on Heroku?

(2) https://www.quora.com/How-do-I-extract-large-zip-files-in-AWS-Lambda

任何正确方向的指示都将不胜感激。

干杯!

如果你愿意稍微改变一下流程,这并不是一个很难解决的问题。

In the client side, the user drags and drops the files the user wants to upload.

当用户请求开始上传操作时,您可以向 API 网关端点发出 HTTP GET 请求,以 Lambda 为后盾。 Lambda 可以查询客户端以前上传的文件,并发回显示哪些文件已经存在的结果集。然后过滤掉那些,只将客户端认为是新的发送到服务器。这将节省用户等待上传发生的时间,并在 S3/Lambda 方面节省您的时间,而不必存储重复项或处理它们。虽然这不能替代 server-side 验证,但您仍会想要这样做。对于合法客户,这将为您和他们节省大量带宽和存储空间。

All the files are then uploaded (whether zipped or otherwise) to a temporary bucket location via the Shrine gem.

这行得通。当他们进入临时存储桶时,使用 Lambda with an S3 event 处理文件、解压缩文件、将所需的任何元数据推送到 DynamoDb 并从临时存储桶中删除文件。在临时存储桶中,我会将文件放入每个请求和用户唯一的文件夹中。我会使用 user/client Id 和某种 UUID,并将其作为您的文件夹名称。例如 Johnathon+3b5339b8-c8db-4d5c-b678-406fcf073f4f,或将此值编码为 Base64 字符串并将其作为您的文件夹名称。将其存储在 DynamoDb 中,每个文件上传到您的永久存储桶中,哈希键为 userid/clientid,排序键为完整文件夹路径 + 文件名和额外属性 IsProcessedIsProcessed 属性将由正在处理文件并将它们移动到其永久 S3 存储桶的 Lambda 更新。如果有错误,您可以将错误放在该字段中。如果成功,则将其放入此字段。

the keys for these files must somehow be returned to the client, to handle validation issues – but then how would the AWS lambda function be able to return this request to the original client side where the request was originated? Or rather,should the AWS lambda function be generated from the client side,passing in the IDs of the unzipped blobs?

将文件推送到临时 S3 存储桶的原始 API 请求将能够 return 将文件夹名称 johnathon+3b5339b8-c8db-4d5c-b678-406fcf073f4f 返回给客户端。假设您创建了一个 HTTP POST 到 /jobs。您会 return 使用 Location /jobs/johnathon+3b5339b8-c8db-4d5c-b678-406fcf073f4f 的 HTTP Header 返回 201 Created。然后您的客户端可以开始轮询 /jobs/johnathon+3b5339b8-c8db-4d5c-b678-406fcf073f4f 以了解进程的状态。

您对 /jobs/johnathon+3b5339b8-c8db-4d5c-b678-406fcf073f4f 的回复可以 return DynamoDB 记录。这将包括与文件夹名称匹配的 HashKey 的所有 DynamoDB 记录。您的客户端可以查看结果集中的所有 objects 并检查 IsProcessed 属性以查看是否一切正常,或者是否存在问题。

Then we need to run some validations: we want to handle the situation where there are duplicate files. We will need to check with our rails backed as to whether those files have already been uploaded.

使用临时存储桶执行的 Lambda 处理此问题。从临时存储桶文件夹中获取文件,处理您的业务逻辑和 back-end 查询,然后将它们推送到它们的最终永久存储桶。

After those validation issues are handled, then user submits the form, and all the keys are stored within the appropriate records.

所有这些都将异步发生,从用户提交表单时开始。客户端需要能够通过向上述端点发出 HTTP GET 请求来处理此问题,检查进程的状态。这为您提供了更大的灵活性,因为您也可以在失败时发布 SNS 消息,例如如果客户上传了 3,000 个文件并且您需要花费 30 分钟来处理它们,则向他们发送电子邮件。