Ruby on rails Rails使用send_文件发送0字节的文件
我无法使send_文件(Model.attachment.path)正常工作。 它不会失败,而是向客户端发送一个0字节大小的文件,尽管文件名是正确的 这个问题是在我从Rails2.3.8迁移到Rails3之后开始出现的 在这次迁移中还发生了很多其他的事情,我将尽我所能详细介绍所有这些事情Ruby on rails Rails使用send_文件发送0字节的文件,ruby-on-rails,linux,nginx,Ruby On Rails,Linux,Nginx,我无法使send_文件(Model.attachment.path)正常工作。 它不会失败,而是向客户端发送一个0字节大小的文件,尽管文件名是正确的 这个问题是在我从Rails2.3.8迁移到Rails3之后开始出现的 在这次迁移中还发生了很多其他的事情,我将尽我所能详细介绍所有这些事情 分发更改/服务器更改。机架空间RHEL5至Linode Ubuntu 10.04LTS Ruby版本更改,1.8.6->1.9.2 Rails版本更改,2.3.8->3.0.0 httpd平台的改变,apach
Started GET "/attachments/replies/1410?1277105698" for 218.102.140.205 at 2010-09-16 09:44:31 +0000
Processing by AttachmentsController#replies as HTML
Parameters: {"1277105698"=>nil, "id"=>"1410"}
Sent file /srv/app/releases/20100916094249/attachments/replies/UE0003-Requisition_For_Compensation_Leave.doc (0.2ms)
Completed 200 OK in 78ms
一切都好。让我也排除本地问题,我已经尝试在Win7和Ubuntu(在Vbox上)上通过Chrome下载
我还要向你们保证,这条道路确实是正确的
root@li162-41:/srv/app/current# tail /srv/app/releases/20100916094249/attachments/replies/UE0003-Requisition_For_Compensation_Leave.doc
#
#
%17nw
HQ��+1ae����
%33333333333(��QR���HX�"%%��@9
��@�p4��#P@��Unknown������������G��z �Times New Roman5��Symbol3&�
�z �Arial5&�
因此,总结一下这个问题,如何让send_file实际发送文件而不是伪0字节垃圾文件。
send_file
具有:x_sendfile
参数,在Rails 3中默认为true
。
此功能通过返回带有X-Sendfile头和path的空响应,将流式下载卸载到前端服务器Apache(带有modxsendfile)或lighttpd
Nginx使用X-Accel-Redirect
标题实现相同的功能,但您必须
在适当的环境文件中正确配置Rails:
config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'
Rails 3更新:这一行已经存在于production.rb
中,只需取消注释即可
添加sendfileon代码>到nginx配置,以利用Rails发送的头。
请记住,必须使用绝对路径,并且nginx必须具有文件的读取权限
别名文件的另一种方式:
为了更好的安全性,我在nginx中使用别名而不是绝对路径,
但是,send_file
方法检查是否存在使用别名失败的文件。
因此,我将我的行动改为:
head(
'X-Accel-Redirect'=> file_item.location,
'Content-Type' => file_item.content_type,
'Content-Disposition' => "attachment; filename=\"#{file_item.name}\"");
render :nothing => true;
在Rails 3中,只需取消注释production.rb
internal environments文件夹中的行config.action\u dispatch.x\u sendfile\u header='x-Accel-Redirect'。我过去在send\u file()中遇到过类似问题,使用send\u data()将我保存回来(例如send\u data file.read(文件名),:disposition=>'inline',:type=>“some/mimetype”)是的,在Rails 3中默认启用X-sendfile时,我也遇到了同样的问题
如果您有大量的“发送文件”调用,
您只需在config/environments/production.rb中注释掉以下行:
#config.action_dispatch.x_sendfile_header = "X-Sendfile"
然后send_file
方法开始完美地工作
因为我无法将x-sendfile扩展名安装到Apache,所以我只是搜索了一下,发现了这个
我希望它能有所帮助。在Rails 4上,我意识到我的问题是删除了我生成的要发送给用户的临时文件
如果我没有删除文件,发送文件就可以了。我没有在thin上进行过测试,但它在Passenger 5上作为独立服务器运行得非常好。我昨天发现了解决方案,今天在博客上对此进行了讨论。config.action\u dispatch.x\u sendfile\u header='x-Accel-Redirect'甚至比head()更好。谢谢你的回答,为我节省了不少时间@五点二十六分你的链接产生一个404@ilasno缓存副本在这里可用:在apache安装上,这也立即解决了我的问题。很好,谢谢你,为我节省了大量调试时间,因为我不想注释掉配置。