Ruby On Rails:send_file通过jquery/ajax请求

Ruby On Rails: send_file through jquery/ajax request

本文关键字:jquery 通过 ajax 请求 file On Rails send Ruby      更新时间:2023-11-26

我在通过ajax从rails服务器下载文件时遇到问题:

我的下载控制器中有一个show操作,如果参数被传递给show操作,它将调用send_file

然后我有一个页面,其中有一个select下拉列表,显示服务器上的文件列表。当我选择一个值并单击下载按钮时,它会发出一个ajax请求,发送一个由我的下载控制器处理的GET请求。

查看我的服务器日志,ajax请求似乎正在工作,它显示:

Started GET "/download?file=test.txt" for 127.0.0.1 at 2012-07-19 15:13:41 -0700
Processing by DownloadsController#show as HTML
  Parameters: {"file"=>"test.txt"}
Sent file /Users/Admin/Documents/rails_projects/test/public/data/test.txt (0.1ms)
Completed 200 OK in 0ms (ActiveRecord: 0.0ms)

然而,实际上什么都没有下载。当我实际手动访问show页面时,文件实际上是下载的。我做错了什么?

--

Javascript

 <script type="text/javascript">
    $(function() {
      $('#button').click(function() {
        var s = $("select#dropdown_select").val();
               $.ajax({
                      type: 'GET',
                      url: 'http://localhost:3000/download?file=' + s,
                      dataType: "HTML"
                      });
      })
    });
  </script>

下载控制器

def show
    filename = params[:dl]
    if(filename.nil? == false)
    path = Rails.root.join('public/data', filename)
    send_file path, :x_sendfile => true
    end
end

我也遇到了同样的问题,但我没有使用JS点击功能,而是使用了rails link标签。

最初,在我的视图中,我有一个带有remote: truelink_to标签(它产生ajax调用)

链接针对的是一个生成PDF的动作。生成并发送了PDF(包含对虾和thinreports),但没有弹出下载对话框。

所以我删除了remote: true并添加了target: '_self',结果是这样的(我使用的是haml)

!= link_to image_tag( 'print.png' ) + (I18n.t :buttons)[:comments][:print],
    customer_comment_path(@address_book),
    { target: '_self' }

而且效果很好。

为什么不尝试使用Rail的link标签重写代码呢?