2

所以我有一个使用 Shrine 作为文件上传器的 Rails 应用程序。同一个应用程序有一个可以点击和发送图片的移动客户端。目前,移动设备正在单击图片并将它们发送到 AWS S3,然后将 S3 URL 返回到 Rails 以与对象关联。此时,一旦 Shrine 收到此 S3 URL,我将其保存到object.upload_remote_url. 随后,Shrine 再次将其上传到 S3,从而为通过 JSON API 传入的每个图像向 S3 发出 2 个请求。

  1. 我想知道的是,处理从 Mobile 到 Web Server 到 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,但我一直在努力让它发挥作用。谁能帮我理解一下?

4

1 回答 1

1
  1. 据我所知,从 Mobile 上传到 Web Server 的最佳实践与从 Browser 到 Web Server 的上传完全相同。我一直主张直接上传到外部服务(S3),然后只将标识符发送到 Web 服务器(而不是直接将文件上传到 Web 服务器)。

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

  3. 将 S3 URL 发送到remote_url属性肯定不是最优的,因为这样 Shrine 会从 S3 下载文件并重新上传到临时存储。Shrine 的工作方式是首先将文件上传到临时存储,然后在验证通过后将文件移动到永久存储。

    Shrine 中“直接上传”的思想是客户端将文件上传到临时存储(在本例中为 S3),并将其作为“已上传文件”发送到服务器;那么 Shrine 只需将其移动到永久存储(可以移动到后台作业)。

    客户端需要发送 S3 标识符的格式如下:

    {
      "storage": "cache",
      "id": "<object-key>",
      "metadata": {...}
    }
    
    • storage- 注册的临时存储的标识符Shrine.storages(通常是“缓存”)
    • id:prefix– S3 对象的键,如果在初始化 Shrine::Storage::S3 时设置,则减去该选项
    • metadata– 客户端提取并希望发送的任何元数据
于 2017-01-14T00:25:10.347 回答