使用 Shrine 处理从移动应用程序到 Rails 端点的文件上传
Handling File Uploads from Mobile Application to a Rails End Point using Shrine
所以我有一个 Rails 应用程序,它使用 Shrine 作为其文件上传器。同样的应用程序有一个可以点击和发送图片的移动客户端。目前,移动设备正在点击图片并将它们发送到 AWS S3,然后将 S3 URL 返回到 Rails 以与对象关联。此时,一旦 Shrine 收到此 S3 URL,我将其保存到 object.upload_remote_url
。随后 Shrine 再次将其上传到 S3,从而为来自 JSON API.
的每张图像向 S3 发出 2 个请求
- 我想知道的是,处理从移动设备到 Web 服务器再到 S3 的文件上传的最佳做法是什么?开发人员使用的最佳技术是什么?
- 如何从手机发送文件 JSON。我知道图像可以转换为 Base64 字符串然后发送,但还有哪些其他选项可用?
- 带有 S3 插件的 Shrine Gem 有一个复制选项,如果我错了,可以纠正我,检查源存储桶中的图像并将其复制到目标存储桶。
http://shrinerb.com/rdoc/classes/Shrine/Storage/S3.html#class-Shrine::Storage::S3-label-Upload+options
下面是我的神社配置
require "shrine/storage/s3"
s3_options = {
access_key_id: Rails.application.secrets.aws_access_key_id,
secret_access_key: Rails.application.secrets.aws_secret_access_key,
region: Rails.application.secrets.aws_region,
bucket: Rails.application.secrets.aws_bucket,
}
copy_from = {
copy_source: "#{Rails.application.secrets.aws_bucket}/mobile"
}
Shrine.storages = {
cache: Shrine::Storage::S3.new(prefix: "cache", upload_options: {acl: "public-read"}, **copy_from, **s3_options),
store: Shrine::Storage::S3.new(prefix: "store", upload_options: {acl: "public-read"}, **copy_from, **s3_options)
}
Shrine.plugin :activerecord
Shrine.plugin :direct_upload
Shrine.plugin :restore_cached_data
Shrine.plugin :upload_options
我正在尝试使用选项 #3,但我无法让它正常工作。谁能帮我理解一下?
据我所知,从移动设备上传到 Web 服务器的最佳做法与从浏览器上传到 Web 服务器的最佳做法完全相同。我一直主张直接上传到外部服务(S3),然后只将标识符发送到 Web 服务器(而不是直接将文件上传到 Web 服务器)。
发送文件的标准方式是通过 multipart/form-data
编码请求,或通过数据 URI(其中文件内容可以选择使用 base64 编码)。当您进行 client-side 图像处理时,使用数据 URI 尤为常见,因为大多数库 return 数据 URI 作为结果。
将S3 URL发送到remote_url
属性肯定不是最优的,因为这样Shrine会从S3下载文件并re-upload到临时文件贮存。 Shrine 的工作方式是先将文件上传到临时存储,然后在验证通过后将文件移动到永久存储。
Shrine 中 "direct uploads" 的想法是 客户端 是将文件上传到临时存储(在本例中为 S3),并将其发送到服务器作为 "already uploaded file";那么 Shrine 只需要将其移动到永久存储(可以移动到后台作业)。
客户端需要发送S3标识符的格式如下:
{
"storage": "cache",
"id": "<object-key>",
"metadata": {...}
}
storage
- 在Shrine.storages
中注册的临时存储的标识符(通常为"cache")
id
– S3 对象的键,如果在初始化时设置 Shrine::Storage::S3 ,则减去 :prefix
选项
metadata
– 客户端提取并想要发送的任何元数据
所以我有一个 Rails 应用程序,它使用 Shrine 作为其文件上传器。同样的应用程序有一个可以点击和发送图片的移动客户端。目前,移动设备正在点击图片并将它们发送到 AWS S3,然后将 S3 URL 返回到 Rails 以与对象关联。此时,一旦 Shrine 收到此 S3 URL,我将其保存到 object.upload_remote_url
。随后 Shrine 再次将其上传到 S3,从而为来自 JSON API.
- 我想知道的是,处理从移动设备到 Web 服务器再到 S3 的文件上传的最佳做法是什么?开发人员使用的最佳技术是什么?
- 如何从手机发送文件 JSON。我知道图像可以转换为 Base64 字符串然后发送,但还有哪些其他选项可用?
- 带有 S3 插件的 Shrine Gem 有一个复制选项,如果我错了,可以纠正我,检查源存储桶中的图像并将其复制到目标存储桶。 http://shrinerb.com/rdoc/classes/Shrine/Storage/S3.html#class-Shrine::Storage::S3-label-Upload+options
下面是我的神社配置
require "shrine/storage/s3"
s3_options = {
access_key_id: Rails.application.secrets.aws_access_key_id,
secret_access_key: Rails.application.secrets.aws_secret_access_key,
region: Rails.application.secrets.aws_region,
bucket: Rails.application.secrets.aws_bucket,
}
copy_from = {
copy_source: "#{Rails.application.secrets.aws_bucket}/mobile"
}
Shrine.storages = {
cache: Shrine::Storage::S3.new(prefix: "cache", upload_options: {acl: "public-read"}, **copy_from, **s3_options),
store: Shrine::Storage::S3.new(prefix: "store", upload_options: {acl: "public-read"}, **copy_from, **s3_options)
}
Shrine.plugin :activerecord
Shrine.plugin :direct_upload
Shrine.plugin :restore_cached_data
Shrine.plugin :upload_options
我正在尝试使用选项 #3,但我无法让它正常工作。谁能帮我理解一下?
据我所知,从移动设备上传到 Web 服务器的最佳做法与从浏览器上传到 Web 服务器的最佳做法完全相同。我一直主张直接上传到外部服务(S3),然后只将标识符发送到 Web 服务器(而不是直接将文件上传到 Web 服务器)。
发送文件的标准方式是通过
multipart/form-data
编码请求,或通过数据 URI(其中文件内容可以选择使用 base64 编码)。当您进行 client-side 图像处理时,使用数据 URI 尤为常见,因为大多数库 return 数据 URI 作为结果。将S3 URL发送到
remote_url
属性肯定不是最优的,因为这样Shrine会从S3下载文件并re-upload到临时文件贮存。 Shrine 的工作方式是先将文件上传到临时存储,然后在验证通过后将文件移动到永久存储。Shrine 中 "direct uploads" 的想法是 客户端 是将文件上传到临时存储(在本例中为 S3),并将其发送到服务器作为 "already uploaded file";那么 Shrine 只需要将其移动到永久存储(可以移动到后台作业)。
客户端需要发送S3标识符的格式如下:
{ "storage": "cache", "id": "<object-key>", "metadata": {...} }
storage
- 在Shrine.storages
中注册的临时存储的标识符(通常为"cache")id
– S3 对象的键,如果在初始化时设置 Shrine::Storage::S3 ,则减去 metadata
– 客户端提取并想要发送的任何元数据
:prefix
选项