Cómo activar la descarga con Rails send_data desde la publicación AJAX

Estoy tratando de usar send_data para devolver una imagen PNG como respuesta a una solicitud posterior ajax. ¿Cómo puedo hacer que el navegador active una descarga en la callback correcta?

Detalles

Estoy generando una imagen base64 grande usando canvas.toDataURL() , y luego la publico en Rails (v3.2.6). Rails lo decodifica a un PNG binario y envía la imagen al cliente.

También he intentado send_file pero tiene el mismo problema.

Otras opciones

  1. Lado del cliente de la descarga de la imagen: no podemos hacer esto porque (1) Safari se bloquea en las grandes URL base64 , y (2) Safari aún no admite el atributo de descarga en las tags de anclaje, que necesitaría para especificar el nombre de archivo de la imagen descargada.

  2. Use $.get lugar de $.post : No podemos hacer esto porque necesitamos enviar nuestro canvas.toDataURL() con la solicitud al servidor. GET solicitudes URI tienen limitaciones de tamaño.

crear una función en el controlador

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

y luego en la acción del controlador

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

y haga una vista parcial en el nombre de la carpeta con _downloadFile.js.erb y escriba esta línea

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

No puedes descargar un archivo a disco desde JS. Es una preocupación de seguridad. Vea la publicación del blog a continuación para una buena solución.

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