Utilisation JavaScript, j'ai un fichier dans la chaîne (obtenu avec la demande Ajax). p>
Comment le télécharger comme fichier sur serveur par une autre demande Ajax? p>
3 Réponses :
Vous devez définir l'en-tête code> Type Code> Type de contenu sur Editer: J'avais mon café maintenant, alors modifié pour JQuery (version sans la bibliothèque ICI ): P> 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:
// 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) {
}
});
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 + '-'; code> ainsi que le contenu du contenu dans les besoins d'appels Ajax être:
"multipart / form-données; limite =" + limite code>
@chovy Ceci est également nécessaire pour les rails. Merci, vous venez de me sauver quelques heures de débogage
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 } });
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?
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))
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.