web-dev-qa-db-fra.com

Rails 4: Comment télécharger des fichiers avec AJAX

Je veux télécharger des fichiers avec AJAX. Dans le passé, j’y suis arrivé en utilisant le plugin magique jQuery et cela a très bien fonctionné. Actuellement, je suis en train de construire une application Rails et d'essayer de faire les choses "à la manière de Rails". J'utilise donc Form Helper et le gem Paperclip pour ajouter des fichiers joints.

Les documents Rails avertissent que l’assistant de formulaire ne fonctionne pas pour les téléchargements de fichiers AJAX:

Contrairement à d'autres formulaires, créer un formulaire de téléchargement de fichier asynchrone n'est pas aussi simple que De fournir form_for avec remote: true. Avec un formulaire Ajax, la sérialisation Est effectuée par JavaScript s'exécutant dans le navigateur et , Car JavaScript ne peut pas lire les fichiers de votre disque dur, le fichier Ne peut pas être téléchargé. La solution la plus courante consiste à utiliser un iframe Invisible servant de cible à la soumission du formulaire.

Il semble clair qu'il n'y a pas de solution prête à l'emploi. Je me demande donc quelle est la chose la plus intelligente à faire. On dirait que j'ai plusieurs options:

  1. Utilisez l’assistant de formulaire et l’astuce iframe.
  2. Utilisez le plugin formulaire helper + load jQuery pour envoyer le fichier (vous ne savez pas si cela va jouer à Nice avec le jeton d'authenticité de Rails, etc.)
  3. Utilisez l’assistant de formulaire + un trombone + [un autre bijou] pour étendre ses fonctionnalités afin de permettre la soumission de formulaires AJAX.

Les trois semblent possibles. Je connais le moins la n ° 3, en particulier la partie [une autre gemme]. J'ai trouvé deux questions similaires ( this et this ) qui mentionnent une branche de Pic-Upload appelée Uploadify, mais celles-ci ont toutes les deux 2 ans et traitent de Rails 2 et 3 (et Uploadify n'a pas été mis à jour dans des années). Donc, compte tenu de tout ce qui a changé, je pense que cette question est toute nouvelle: 

Quel est le meilleur moyen de télécharger des fichiers avec AJAX dans Rails 4?

18
emersonthis

Jetez un coup d'œil à la gemme remotipart: https://github.com/JangoSteve/remotipart - peut vous mener jusqu'au bout avec très peu de travail!

8
pdobb

IMHO Rails n'est pas parfait pour gérer le téléchargement de fichiers avec AJAX, surtout si vous voulez une barre de progression. Ma suggestion est d'utiliser Javascript pour la soumission du formulaire via une demande AJAX comme vous l'avez suggéré dans (2). Si vous êtes à l'aise avec Javascript, vous n'aurez pas beaucoup de problèmes.

J'ai récemment utilisé la même approche en utilisant cette très simple bibliothèque JS https://github.com/hayageek/jquery-upload-file et j'ai écrit plus de détails ici http: //www.alfredo.motta. nom/upload-video-files-with-Rails-Paperclip-and-jquery-upload-file/

Pour une application avec un formulaire pour télécharger un film avec un titre et une description, le code JS se présente comme suit:

$(document).ready(function() {
  var uploadObj = $("#movie_video").uploadFile({
    url: "/movies",
    multiple: false,
    fileName: "movie[video]",
    autoSubmit: false,
    formData: {
      "movie[title]": $('#movie_title').text(),
      "movie[description]": $('#movie_description').text()
    },
    onSuccess:function(files,data,xhr)
    {
      window.location.href = data.to;
    }
  });

  $("#fileUpload").click(function(e) {
    e.preventDefault();
    $.Rails.disableFormElements($($.Rails.formSubmitSelector));
    uploadObj.startUpload();
  });
});

Loin d'être parfait, mais vous donne de la souplesse sur votre interface.

1
mottalrd