Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails使用send_文件发送0字节的文件_Ruby On Rails_Linux_Nginx - Fatal编程技术网

Ruby on rails Rails使用send_文件发送0字节的文件

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

我无法使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平台的改变,apache2->nginx(不过我也在apache2上试过,但没有成功)
  • 我通过ftp移动附件,因为它们不属于我的git存储库,所以它们是通过cap deploy发布的,而不是手动ftp远程(RHEL5)到本地(Win7),然后本地(Win7)到远程(Ubuntu10)

    我确实知道FTPing不会通过传输保留文件权限,因此我所做的也是模仿我以前的服务器上看到的chmods,因此它们几乎相同。(用户/组不同,设置为root:root而不是olduser:olduser)

    请求从我的生产日志下载附件的一个片段

    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安装上,这也立即解决了我的问题。很好,谢谢你,为我节省了大量调试时间,因为我不想注释掉配置。