Не удается прочитать файл с функцией send_file в Rails 3

Код, который я использую:

В файле просмотра:

 <%= 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 ответа

Решение

Проблема была:

Я использовал

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

Так должно быть

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

PS: убедитесь, что вы подтвердили, что изображение / запись существует.

Просто измените метод URL по пути:

send_file  @image.attachment.path # this is the right way!.

Я не знаю, как сохранить URL-адрес прикрепленного изображения, но в целом имя файла должно выглядеть следующим образом:

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

Обратите внимание на то, что в конце нет "? Xxxxx".

Вы можете проверить свою файловую систему, является ли имя файла "Снимок экрана 2011-11-04 в 3.14.03 PM.png" или "Снимок экрана 2011-11-04 в 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 и проверьте имя файла.

Я до сих пор не могу понять, в чем проблема на самом деле, только некоторые предложения.

Является ли это ?1320582022 принадлежат к имени файла? Я не уверен насчет пробелов в имени файла, может быть, они должны быть экранированы.

Другие вопросы по тегам