Не удается прочитать файл с функцией 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
принадлежат к имени файла? Я не уверен насчет пробелов в имени файла, может быть, они должны быть экранированы.