【问题标题】:Ruby On Rails: send_file through jquery/ajax requestRuby On Rails:通过 jquery/ajax 请求发送文件
【发布时间】:2012-07-19 04:44:56
【问题描述】:

我无法通过 ajax 从我的 rails 服务器下载文件:

如果将参数传递给显示操作,我的下载控制器中有一个显示操作调用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

【问题讨论】:

  • 你不能用ajax下载文件,你应该允许用户提交表单(选择你提到的)并允许浏览器处理请求和响应

标签: javascript ruby-on-rails ajax sendfile


【解决方案1】:

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

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

该链接针对生成 PDF 的操作。 PDF 已生成(带有 prawn 和 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 标签重写代码?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-24
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 2011-10-16
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多