Rails - 通过 API 将文件直接上传到 S3

Rails - Upload files direct to S3 via API

如何在 Rails 中开发一个 API 将文件直接上传到 S3?我可以通过搜索和现有 gems 找到的所有内容都使用 jQuery,显然我的 API 无法使用。

现在我正在使用 Paperclip 执行上传,但这会在上传文件时锁定 Unicorn 进程。

我一直在做一个有类似要求的项目,我使用的解决方案是让客户端(在我的例子中是 iOS 应用程序)将文件上传到我们 S3 存储桶中的临时文件夹直接地。

假设带有回形针附件的模型名为 Asset,这是我们目前所做的:

  1. 客户端上传想要的文件到S3
  2. 如果上传成功,客户端会 ping API 并传递文件位置的详细信息。
  3. 在我们的例子中,API creates/updates Asset 模型具有下载 S3 文件的路径并立即 returns。
  4. 然后,我们为 API 服务器启动一个 delayed_job 进程,以从我们的 S3 存储桶中获取和处理文件。
  5. 处理结束后,我们从 S3 存储桶中删除临时文件。

这是一些伪代码

客户端将文件上传到 S3(在我们的例子中使用 ASW iOS SDK)

[[BSAAWSWrapper sharedAWSWrapper] uploadFileToBucket:url progressBlock:... completionBlock:...]

将上传文件的详细信息发送到 API

POST "server.com/api/assets"
Parameters: {..., "s3_upload_path"=>"temp/UEA8zLE7FJ.m4v"}

API 控制器

def create
  # create logic here
  @asset.delay.fetch_s3_upload
end

资产模型

class Asset
  has_attached_file :video
  ...

  def fetch_s3_upload
    url = "http://#{ENV['AWS_S3_HOST_NAME']}/#{ENV['AWS_S3_BUCKET_NAME']}/#{self.s3_upload_path}"
    self.video = URI.parse(url)
    self.video_content_type = "video/mp4"
    if self.save
      # delete temp file from S3
    end
  end
end