5

私の Rails アプリでは、Carrierwave を使用して Amazon S3 に画像をアップロードしています。イメージを再アップロードすることなく、既存の Amazon S3 イメージを参照したいと思います。たとえば、既存の Amazon S3 イメージがhttp://test.s3.amazonaws.com/image/path/0001/image.jpgにある場合、このイメージを指すようにイメージのパスを更新できますか? 私はリモート アップロード オプションを使用したくありません。なぜなら、既に存在するものとまったく同じ画像を使用したいだけだからです (ただし、レコードの「パス」属性に保存します)。

コンソールで、私は試しました:

image.update_attributes(:path=> "http://test.s3.amazonaws.com/image/path/0001/image.jpg")

しかし、これは画像のパスをオーバーライドできません。

4

4 に答える 4

5

チャイムイン、遅刻するよりはましです!警告: これは Rails 4 用であり、現時点では Rails 4.1 でのみテストしています。

これは必要以上に難しいと思います。これが私にとって絶対に重要だった理由は、CloudFlare SSL の制限 (および常識) のために、ホストで受信できない 100MB 以上の MP3 ファイルを添付しているためです。幸いなことに、AWS は事前承認済みのアップロードをサポートしており、私は Carrierwave に正しいことをしてもらいました。

ステップ 1: Carrierwave にファイルを保存する場所を教えてもらいます。

 m.raw_write_attribute('file','file.mp3');
 url = m.file.url
 signed = aws_presigned_url(url)

raw_write_attribute何も保存せず、値を設定するときに搬送波をバイパスするだけです。これにより、オブジェクトは、データベースから「file.mp3」を読み取ったかのように動作します。次に、Carrierwave に「ファイルの保存場所」を尋ねることができます。次に、ファイルをクライアントから S3 に直接アップロードします。それが完了したら、Rails に対して別の API 呼び出しを行い、次のコードを実行します。

 m.raw_write_attribute('file','file.mp3');
 m.update_attribute('file','file.mp3');

これら 2 つのペアは、Carrierwave を回避します。1つ目は「file」列が「file.mp3」に設定されているとcarrierwaveに認識させ、2つ目は「file.mp3」をDBに永続化するようレールに明示的に指示します。コールのためraw_write_attribute、Carrierwave は 2 番目のスルーを変更せずに許可します。

于 2015-02-26T17:48:33.237 に答える