【问题标题】:Rails - Upload files direct to S3 via APIRails - 通过 API 将文件直接上传到 S3
【发布时间】:2015-03-31 19:45:08
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    1. 客户端将所需文件上传到 S3
    2. 如果上传成功,客户端然后 ping API 传递文件位置的详细信息。
    3. 在我们的例子中,API 使用下载 S3 文件的路径创建/更新Asset 模型并立即返回。
    4. 然后,我们为 API 服务器启动了一个延迟作业进程,以从我们的 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
    

    【讨论】:

      猜你喜欢
      • 2020-11-14
      • 2012-04-11
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 2012-03-10
      相关资源
      最近更新 更多