使用 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 个请求
  1. 我想知道的是,处理从移动设备到 Web 服务器再到 S3 的文件上传的最佳做法是什么?开发人员使用的最佳技术是什么?
  2. 如何从手机发送文件 JSON。我知道图像可以转换为 Base64 字符串然后发送,但还有哪些其他选项可用?
  3. 带有 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,但我无法让它正常工作。谁能帮我理解一下?

  1. 据我所知,从移动设备上传到 Web 服务器的最佳做法与从浏览器上传到 Web 服务器的最佳做法完全相同。我一直主张直接上传到外部服务(S3),然后只将标识符发送到 Web 服务器(而不是直接将文件上传到 Web 服务器)。

  2. 发送文件的标准方式是通过 multipart/form-data 编码请求,或通过数据 URI(其中文件内容可以选择使用 base64 编码)。当您进行 client-side 图像处理时,使用数据 URI 尤为常见,因为大多数库 return 数据 URI 作为结果。

  3. 将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 – 客户端提取并想要发送的任何元数据