7

私が使用しているコード:

ビュー ファイル内:

 <%= link_to "Download", download_image_path(image) %>

コントローラーで:

def download
  @image = Image.find(params[:id])
  send_file "#{RAILS_ROOT}/public"  + @image.attachment.url
end

エラーが発生します:

Cannot read file /Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022

PS: ダブル チェック、ファイルが存在します。それぞれのすべてのコントローラー内のすべてのファイル (画像、pdf、ビデオ) について、サーバー上で同じ問題が発生します。

4

4 に答える 4

16

問題は次のとおりです。

使っていた

 @image = Image.find(params[:id])
 send_file "#{RAILS_ROOT}/public"  + @image.attachment.url

そのはず

 @image = Image.find(params[:id])
 send_file  @image.attachment.path

PS:画像/レコードが存在することを確認してください。

于 2011-12-06T20:57:16.977 に答える
3

URL メソッドをパスで変更するだけです。

send_file  @image.attachment.path # this is the right way!.
于 2013-08-12T15:41:35.107 に答える
1

画像の添付ファイルの URL を保存する方法はわかりませんが、一般的に、ファイル名は次のようになります。

/Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png

最後に「?xxxxx」がないことに注意してください。

ファイル名が「Screen Shot 2011-11-04 at 3.14.03 PM.png」または「Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022」のどちらであるか、ファイル システムを確認できます。

ファイルの URL の場合、次のようなものかもしれません: http://example.com/xxx?dddd、どの文字 "?" パスとパラメータを分割します。文字列「dddd」は、URL パスを要求するときのパラメーターであり、パスまたはファイル名の一部ではありません。パラメータは URL でのみサポートされ、ローカル ファイル名ではサポートされません。

したがって、画像添付ファイルの URL を保存するコードを確認する必要があると思います。このコードでは、パラメーターを除外し、ファイル名のみを指定する必要があります。そして、名前がディスクに保存されたファイルと正確に同じであることを確認してください。

また、irb を介してファイルを直接開いて、出力を確認することもできます。

>>> irb
irb> f = open('/Users/mohit/projects/my_app/public/system/attachments/4/original/Screen Shot 2011-11-04 at 3.14.03 PM.png?1320582022')

その他、send_file でエラーの場所を探し、ファイル名を確認してください。

問題が実際に何であるかをまだ確認できません。いくつかの提案です。

于 2011-12-05T14:39:54.833 に答える
0

これ?1320582022はファイル名に属しますか?ファイル名の空白についてもよくわかりません。おそらくエスケープする必要があります。

于 2011-12-05T13:08:41.010 に答える