3

これは私を狂わせています。Amazon S3でCarrierWaveを使用しているので、ファイルをバケットに安全にアップロードできます。今度は(別のリクエストで)ファイルを取得して、ダウンロードとしてブラウザーに配信しようとしています。

ファイルは、.zipファイルなど、何でもかまいません。画像の保存には使用していません。

バケットはプライベートであり、パブリックではないため、S3URLだけを使用することはできません。

これが私の取得コードです:

au = @note.attachment
au.retrieve_from_store!(File.basename(@note.attachment.to_s))
au.cache_stored_file!

cache_stored_fileのコードエラー!ライン。エラーをスローする:

undefined method `body' for nil:NilClass

オブジェクトを調べてみると、問題ないように見えます。@ note.attachmentを出力すると、キーなどを使用してAmazons3のURLをはっきりと確認できます。

Ivはウェブのいたるところにあり、私はそれを理解することができます。Ivは、同じ問題を抱えている少数の人々が、私の場合とは関係のないこと(imagemagickメソッドを使用するなど)を実行して問題を解決したことを発見しました。これも、単なるファイルです。

処理や画像の処理はありません。ダウンロードとしてファイルをブラウザに返したいだけです。

誰か助けてもらえますか?

これが私のアップローダーです:

class AttachmentUploader < CarrierWave::Uploader::Base

  storage :fog

  def store_dir
    "#{Rails.env}/#{model.id}"
  end

  def cache_dir
    "#{Rails.root}/tmp/attachments"
  end
end

とトレース

carrierwave (0.8.0) lib/carrierwave/storage/fog.rb:225:in `read'
carrierwave (0.8.0) lib/carrierwave/uploader/cache.rb:77:in `sanitized_file'
carrierwave (0.8.0) lib/carrierwave/uploader/cache.rb:116:in `cache!'
carrierwave (0.8.0) lib/carrierwave/uploader/cache.rb:73:in `cache_stored_file!'
4

1 に答える 1

4

これらの行は意味がないと思います:

au = @note.attachment
au.retrieve_from_store!(File.basename(@note.attachment.to_s))
au.cache_stored_file!

retrieve_from_storeこれは、アタッチされたオブジェクトではなく、アップローダーで通常呼び出すものです。添付ファイルのベース名をそれ自体に渡すという複雑な手順により、警告ベルが全体的に鳴るはずです。

私があなたを正しく理解しているなら、あなたは単にあなたがS3に保存したファイルをダウンロードする可能性をユーザーに与えたいだけです。

これを行うには、いくつかの方法があります。

@note.attachment.url最も簡単なのは、ユーザーがクリックできるリンクとしてURLを呼び出して印刷することです。

もう1つの方法は、コントローラーアクションでユーザーをURLにリダイレクトすることです。

# notes/1/download_attachment   
def download_attachment
  @note = Note.find(params[:id)
  redirect_to @note.attachment.url
end

最後の1つの方法は、プロキシサーバー/キャッシュとして機能し、S3からファイルをフェッチして返すことです。

コントローラで次のようにすることができます。

file = open(@note.attachment.url)
send_data file

この最後のコードスニペットをテストする機会がなかったことに注意してください。

send_dataの詳細については、こちらをご覧ください。

于 2013-03-06T08:15:15.487 に答える