如何从AJAXpost中使用Rails send_data触发下载

我正在尝试使用send_data返回PNG图像作为ajax post请求的响应。 如何让浏览器触发成功回调的下载?

细节

我正在使用canvas.toDataURL()生成一个大的base64图像,然后将其发布到Rails(v3.2.6)。 Rails将其解码为二进制PNG,并将图像发送回客户端。

我也试过send_file但它有同样的问题。

其他选择

  1. 下载图像客户端:我们不能这样做,因为(1) Safari在大型base64 URL上崩溃 ,以及(2) Safari还不支持锚标签上的下载属性 ,我需要指定下载的图像文件名。

  2. 使用$.get而不是$.post我们不能这样做,因为我们需要将带有请求的canvas.toDataURL()发送到服务器。 GET请求URI具有大小限制。

在控制器中创建一个函数

 def ajax_download send_file "path_to_file/" + params[:file] end 

然后在控制器动作中

 respond_to do |format| @java_url = "/home/ajax_download?file=#{file_name}" format.js {render :partial => "downloadFile"} end 

并使用_downloadFile.js.erb创建部分视图文件夹名称并写入此行

 window.location.href = "<%=@java_url %>" 

您无法从JS将文件下载到磁盘。 这是一个安全问题。 请参阅下面的博客文章以获得一个好的解决方法。

http://johnculviner.com/post/2012/03/22/Ajax-like-feature-rich-file-downloads-with-jQuery-File-Download.aspx