2

したがって、Shrine をファイル アップローダーとして使用する Rails アプリケーションがあります。同じアプリには、写真をクリックして送信できるモバイル クライアントがあります。現在、モバイルは画像をクリックして 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で作業しようとしていますが、それを機能させようとして立ち往生しています。誰でもそれを理解するのを手伝ってもらえますか?

4

1 に答える 1

1
  1. 私の知る限り、モバイルから Web サーバーへのアップロードのベスト プラクティスは、ブラウザから Web サーバーへのアップロードとまったく同じです。私は常に、外部サービス (S3) に直接アップロードしてから、(ファイルを Web サーバーに直接アップロードするのではなく) ID だけを 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 に答える