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

时间:2015-03-17 17:02:55

标签: ruby-on-rails amazon-s3 paperclip

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

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

1 个答案:

答案 0 :(得分:3)

我一直在研究一个具有类似要求的项目,我使用的解决方案是客户端(在我的情况下是一个iOS应用程序)直接将文件上传到S3存储桶中的临时文件夹。

假设带有回形针附件的模型被称为Asset,我们目前正在做的事情:

  1. 客户端将所需文件上传到S3
  2. 如果上传成功,则客户端会ping通过文件位置详细信息的API。
  3. 在我们的示例中,API使用下载S3文件的路径创建/更新Asset模型并立即返回。
  4. 然后,我们为API服务器启动delayed_job进程,以从S3存储桶中获取和处理该文件。
  5. 处理结束后,我们从S3存储桶中删除临时文件。
  6. 这是一些伪代码

    客户端将文件上传到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