Rails - 通过 API 将文件直接上传到 S3
Rails - Upload files direct to S3 via API
如何在 Rails 中开发一个 API 将文件直接上传到 S3?我可以通过搜索和现有 gems 找到的所有内容都使用 jQuery,显然我的 API 无法使用。
现在我正在使用 Paperclip 执行上传,但这会在上传文件时锁定 Unicorn 进程。
我一直在做一个有类似要求的项目,我使用的解决方案是让客户端(在我的例子中是 iOS 应用程序)将文件上传到我们 S3 存储桶中的临时文件夹直接地。
假设带有回形针附件的模型名为 Asset
,这是我们目前所做的:
- 客户端上传想要的文件到S3
- 如果上传成功,客户端会 ping API 并传递文件位置的详细信息。
- 在我们的例子中,API creates/updates
Asset
模型具有下载 S3 文件的路径并立即 returns。
- 然后,我们为 API 服务器启动一个 delayed_job 进程,以从我们的 S3 存储桶中获取和处理文件。
- 处理结束后,我们从 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
如何在 Rails 中开发一个 API 将文件直接上传到 S3?我可以通过搜索和现有 gems 找到的所有内容都使用 jQuery,显然我的 API 无法使用。
现在我正在使用 Paperclip 执行上传,但这会在上传文件时锁定 Unicorn 进程。
我一直在做一个有类似要求的项目,我使用的解决方案是让客户端(在我的例子中是 iOS 应用程序)将文件上传到我们 S3 存储桶中的临时文件夹直接地。
假设带有回形针附件的模型名为 Asset
,这是我们目前所做的:
- 客户端上传想要的文件到S3
- 如果上传成功,客户端会 ping API 并传递文件位置的详细信息。
- 在我们的例子中,API creates/updates
Asset
模型具有下载 S3 文件的路径并立即 returns。 - 然后,我们为 API 服务器启动一个 delayed_job 进程,以从我们的 S3 存储桶中获取和处理文件。
- 处理结束后,我们从 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