Comment déclencher le téléchargement avec des Rails send_data de l'AJAX post
Je suis en train d'utiliser send_data
pour renvoyer une image PNG que la réponse pour un ajax requête post. Comment puis-je obtenir le navigateur pour déclencher un téléchargement sur le succès de rappel?
Détails
Je suis de la génération d'un grand base64 image à l'aide de canvas.toDataURL()
, puis de les poster à Rails (v3.2.6). Rails décode binaire, PNG, et envoie l'image vers le client.
J'ai aussi essayé de send_file
mais il a le même problème.
Autres options
-
Télécharger l'image côté client: Nous ne pouvons pas faire cela, parce que (1) Safari se bloque sur grand base64 Url, et (2) Safari ne prend pas encore en charge le téléchargement de l'attribut sur les balises d'ancrage qui j'aurais besoin de spécifier le nom de fichier image téléchargé.
-
Utiliser un
$.get
au lieu de$.post
: Nous ne pouvons pas faire cela parce que nous avons besoin d'envoyer noscanvas.toDataURL()
avec la demande au serveur.GET
demandes d'Uri ont des limitations de taille.
- Eh bien placer les données de la requête AJAX dans la session, puis déclencher le téléchargement par
location.href="..."
pointant vers un script qui envoie les en-têtes appropriés, transmet les données à partir de la session et par la suite le supprime de la session. - Pas sûr de savoir pourquoi vous souhaitez utiliser une requête AJAX pour télécharger un fichier. Un non-AJAX link_to que reverences un send_data/send_file action doit télécharger l'image.
- Je pense que c'est un http standard sur la façon de télécharger des données en tant que fichier. peut-être que l'utilisation content_type: 'image/png' ?
- J'ai eu à faire le même type de chose et a terminé juste de décodage et de l'enregistrement de l'image côté serveur, puis à l'aide de la fenêtre.ouvert en javascript pour ouvrir une fenêtre utilisée send_file du serveur pour obtenir l'image, puis il suffit de supprimer la temp de l'image sur le serveur.
Vous devez vous connecter pour publier un commentaire.
créer une fonction de contrôleur de
puis de contrôleur de l'action
et en partie dans l'affichage du nom de dossier avec _downloadFile.js.erb et écrire cette ligne
params[:file]
danssend_file
est unsanitized, et pourrait conduire à des vols de données.Vous ne pouvez pas télécharger un fichier sur le disque JS. C'est un problème de sécurité. Voir le blog ci-dessous pour une bonne solution de contournement.
http://johnculviner.com/post/2012/03/22/Ajax-like-feature-rich-file-downloads-with-jQuery-File-Download.aspx