使用Rails API + ActiveStorage将iOS到S3直接上传

时间:2018-08-06 14:45:40

标签: amazon-s3 rails-activestorage

我有一个API,该API带有使用Rails和ActiveStorage(带有S3作为文件服务器)的文件上传端点。我想直接从客户端应用程序上传到S3,但是Active Storage文档中提供的代码仅显示使用Javascript https://edgeguides.rubyonrails.org/active_storage_overview.html#direct-uploads

由于我直接将带有文件的POST请求发送到Rails API,所以没有地方可以运行JS。

仅使用Rails API的应用程序可以使用直接上传吗?

1 个答案:

答案 0 :(得分:0)

为了解决类似的问题,我遵循了AWS documentation

中提出的方法

简单的概念是,对于要上传的每个文件,我执行以下工作流程:

  1. 向我的服务器请求一个S3 presigned_url / public url对
  2. 通过发布/发送文件(取决于您选择的前缀)将文件发送到S3
  3. 一旦我从S3上传文件中获得200(确定),就会向我的服务器发送一个新请求,其中包含我要更新的资源,并且在该资源的参数中包含了公共URL。

例如:

  1. GET myserver.com/api/signed_url?filename=<safe_file_name>

1.1。回复

{ presigned_url: "https://bucket-name.s3.us-west-1.amazonaws.com/uploads/1bb275c5-0199-41fe-ac40-133601f5efb0?x-amz-acl=public-read...", public_url: "https://bucket-name.s3.us-west-1.amazonaws.com/uploads/1bb275c5-0199-41fe-ac40-133601f5efb0" }

  1. PUT <presigned_url>, data: <file_to_upload>, cache: false, processData: false

2.1。等待S3直接上传200(确定)

  1. POST myserver.com/api/document, data: { name: 'new file', document_url: <public_url> }