12
votes

Comment télécharger une chaîne comme fichier avec jQuery ou autre cadre JS

Utilisation JavaScript, j'ai un fichier dans la chaîne (obtenu avec la demande Ajax).

Comment le télécharger comme fichier sur serveur par une autre demande Ajax?


2 commentaires

Veuillez clarifier: Avez-vous un chemin de fichier comme une chaîne ou que vous avez le contenu de fichier en tant que chaîne et que vous souhaitez l'avoir téléchargé en tant que fichier?


@Marko: Il se lit comme il a le contenu du fichier dans une chaîne, qu'il a obtenu d'une demande Ajax.


3 Réponses :


17
votes

Vous devez définir l'en-tête code> Type Code> Type de contenu sur Multipart / Form-Data ​​CODE> et jouez avec le format un peu, en ordinable ol 'JavaScript (TM), mais vous pouvez facilement retravailler pour Une bibliothèque:

Editer: J'avais mon café maintenant, alors modifié pour JQuery (version sans la bibliothèque ICI ): P>

// Define a boundary, I stole this from IE but you can use any string AFAIK
var boundary = "---------------------------7da24f2e50046";
var body = '--' + boundary + '\r\n'
         // Parameter name is "file" and local filename is "temp.txt"
         + 'Content-Disposition: form-data; name="file";'
         + 'filename="temp.txt"\r\n'
         // Add the file's mime-type
         + 'Content-type: plain/text\r\n\r\n'
         // Add your data:
         + data + '\r\n'
         + '--'+ boundary + '--';

$.ajax({
    contentType: "multipart/form-data; boundary="+boundary,
    data: body,
    type: "POST",
    url: "http://asite.com/apage.php",
    success: function (data, status) {
    }
});


4 commentaires

MMM bien! Je ne savais pas que c'était possible dans une demande Ajax.


@Pekka: Bien sûr. Handy Si vous n'avez pas de contrôle sur le serveur, vous téléchargez vers et il doit accepter un fichier texte affiché avec des données multiparties / formes.


Cela a fonctionné, à l'exception de deux ajustements pour fonctionner avec Express / noeud: 1) La dernière limite doit être + '-' + limite + '-'; ainsi que le contenu du contenu dans les besoins d'appels Ajax être: "multipart / form-données; limite =" + limite


@chovy Ceci est également nécessaire pour les rails. Merci, vous venez de me sauver quelques heures de débogage



20
votes

Voici comment le faire sans construire manuellement le corps de la demande de plusieurs pièces:

var s = 'some string data';
var filename = 'foobar.txt';

var formData = new FormData();
formData.append('file', new File([new Blob([s])], filename));
formData.append('another-form-field', 'some value');

$.ajax({
    url: '/upload',
    data: formData,
    processData: false,
    contentType: false,
    type: 'POST',
    success: function () {
        console.log('ok');
    },
    error: function () {
        console.log('err'); // replace with proper error handling
    }
});


4 commentaires

Semble bien ... puis-je transcoder base64 à un objet de fichier? Si non, je peux utiliser la base64 et le décoder sur le serveur. mais je suis juste curieux


Est-ce que FormData Object Cross Browser Browser est-il compatible?


J'utilise Dropzone, mais cette réponse fonctionne pour convertir une chaîne en un fichier de téléchargement ("nouveau fichier (neuf blob ([S])], nom de fichier)").


Pourquoi le contenu est-il faux?



1
votes

solution à l'aide de nouveaux formdata () sans AJAX

str = "Hello!\nI'm text string";
var strblob = new Blob([str], {type: 'text/plain'});

var formdata = new FormData();
formdata.append("file", strblob, "file.txt");
formdata.append("field-1", "field-1-data");

var requestOptions = {
  method: 'POST',
  body: formdata,
  redirect: 'follow'
};

fetch("http://{url}", requestOptions)
  .then(response => response.text())
  .then(result => console.log(result))
  .catch(error => console.log('error', error))


0 commentaires