2011-12-05 16 views
6

的代码我使用:无法读取与由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,视频)都是同样的问题。

回答

15

问题是:

我用

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

应该

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

PS:请确保您验证图像/记录存在。

+0

如果使用brakeman分析代码,那么它会将错误显示为用作文件名的MOdel属性。只是跑刹车。 其考虑为 send_file Image.find(params [:id])。uploaded_file.path – errakeshpd

0

这个?1320582022属于文件名吗?我不确定文件名中是否有空白,也许他们需要转义。

+0

屏幕截图2011-11-04在03年3月14日PM.png是文件名和1320582022即将原因即时得到问题的发展模式.. –

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错误位置,并检查文件名。

我仍然无法确定问题究竟是什么,只是一些建议。

+0

这是个好建议.. –

2

由路径只需更改URL方法:

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