En utilisant javascript, j'ai un fichier en chaîne (obtenu avec une requête ajax). Comment le télécharger en tant que fichier sur le serveur par une autre requête ajax?Comment télécharger une chaîne en tant que fichier avec jQuery ou autre framework js
Répondre
Vous devez définir l'en-tête de demande Content-type
-multipart/form-data
et jouer avec le format un peu, I wrote this en JavaScript PLAIN Ol (tm) mais vous pouvez facilement retravailler pour une bibliothèque:
EDIT: Si mon café maintenant, donc il modifié pour jQuery (sans bibliothèque Version here):
// 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, c'est gentil! Je ne savais pas que c'était possible dans une requête Ajax. –
@Pekka: Bien sûr. Pratique si vous n'avez pas de contrôle sur le serveur que vous téléchargez et qu'il doit accepter un fichier texte posté avec multipart/form-data. –
Cela a fonctionné, sauf deux ajustements pour travailler avec express/node: 1) la dernière limite doit être '+ '-' + boundary + '-';' et aussi le contentType dans l'appel ajax doit être: ' "multipart/form-data; boundary =" + boundary' – chovy
Voici comment le faire sans créer manuellement le corps de la demande en plusieurs parties:
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 fichier? Si non, je peux utiliser le base64 et le décoder sur le serveur. mais juste curieux – redestructa
Est-ce que l'objet FormData est compatible avec plusieurs navigateurs? –
Veuillez clarifier: avez-vous un chemin de fichier sous forme de chaîne ou vous avez un contenu de fichier sous forme de chaîne et vous souhaitez le télécharger en tant que fichier? –
@Marko: Il se lit comme s'il contenait le contenu d'un fichier dans une chaîne, obtenue à partir d'une requête ajax. –