如何上载文件以及如何处理和验证-非常概述? 一般概述是什么意思?

眼前的问题

  1. 我有一个Rails应用程序。
  2. 用户将上传文件。 1到3000个文件之间的任何位置。有时它们是zip文件,有时不是。我不想用这些文件上传来阻止服务器,所以我正在寻找解决此问题的方法。
  3. 压缩后的文件必须解压缩。
  4. 然后我要检查是否:用户以前上传了相同的文件?例如,如果用户一周前已经上传了相同的文件(2),则存在问题:(i)我们不允许该特定文件上传,或者我们询问用户:确定要吗再次上传相同的文件?
  5. 然后我想将密钥/链接存储到后端相应模型/记录中的文件中。

想知道处理上述问题的最佳工作流程是什么:即一个非常概括的概述:换句话说,可以最好地使用AWS Lambda / Google云计算等解决上述问题吗?我们将如何使用神社的宝石来最好地处理这种情况?使用AWS Lambda而不是使用后台作业有意义吗?

我的偏好是使用Shrine宝石进行上传。

我的想法:

  1. 在客户端,用户拖放用户的文件 要上传。
  2. 然后通过Shrine宝石将所有文件(无论是压缩文件还是其他文件)上传到临时存储区。
  3. 如果上传了zip文件,则可能必须触发AWS lambda函数以解压缩文件。如果真是这样,那么到最后,必须以某种方式将这些文件的密钥返回给客户端,以处理验证问题–但是,AWS Lambda函数将如何将该请求返回给原始客户端请求来自何处?还是应该从客户端生成AWS lambda函数,并传递未压缩的Blob的ID?
  4. 然后,我们需要运行一些验证:我们要处理存在重复文件的情况。我们将需要检查一下这些文件是否已经上传。
  5. 处理完这些验证问题后,用户提交表单,并将所有密钥存储在适当的记录中。

这些想法绝不是规定性的

我正在寻求一些关于如何做到这一切的最佳方法的一般建议。我绝不局限于AWS:我可以轻松地使用Google或Azure。上面的任何指导将不胜感激。

具体问题:

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

一般概述是什么意思?

以下是一些概述的示例:

(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

任何朝着正确方向的指针将不胜感激。

干杯!

HOPEHAPPY111 回答:如何上载文件以及如何处理和验证-非常概述? 一般概述是什么意思?

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

  

在客户端,用户拖放要上传的文件。

当用户请求开始上载操作时,您可以向以Lambda为后盾的API Gateway端点发出HTTP GET请求。 Lambda可以查询客户端上传的先前文件,并发送回结果集,以显示已存在的文件。然后,您将它们过滤掉,并仅将认为是新的内容从客户端发送到服务器。这将节省用户等待上载发生的时间,并节省了您不必存储副本或处理副本的S3 / Lambda方面的时间。但是,这不能替代服务器端验证,您仍然需要这样做。对于合法客户,这将为您和他们节省大量带宽和存储空间。

  

然后将所有文件(无论是压缩文件还是其他文件)通过Shrine宝石上传到临时存储区。

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

  

必须以某种方式将这些文件的密钥返回给客户端,以处理验证问题–但是,AWS Lambda函数将如何将该请求返回给发起请求的原始客户端?还是应该从客户端生成AWS lambda函数,并传递未压缩的Blob的ID?

将文件推送到temp S3存储桶的原始API请求将能够将文件夹名称johnathon+3b5339b8-c8db-4d5c-b678-406fcf073f4f返回给客户端。假设您对/jobs进行了HTTP POST。您将使用HTTP标头201 Created返回Location /jobs/johnathon+3b5339b8-c8db-4d5c-b678-406fcf073f4f。然后,您的客户可以开始向/jobs/johnathon+3b5339b8-c8db-4d5c-b678-406fcf073f4f轮询该进程的状态。

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

  

然后,我们需要运行一些验证:我们要处理存在重复文件的情况。我们将需要检查一下这些文件是否已经上传。

使用由临时存储区执行的Lambda进行处理。从临时存储区文件夹中抓取文件,处理您的业务逻辑和后端查询,然后将其推入最终的永久存储区。

  

在处理了这些验证问题之后,用户提交表单,并将所有密钥存储在适当的记录中。

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

本文链接:https://www.f2er.com/2916064.html

大家都在问