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

我不知道你如何保存图片附件的网址,但一般来说,文件名应该是:

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

请注意,它最后没有“?xxxx”。

您可以检查您的文件系统,文件名是“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 回答