Bonjour à tous :)
Je suis nouveau sur le forum et ai appris nodejs grâce aux très précieux tutoriels de Grafikart :)
Pour les besoins de l'apprentissage j'essai pour commencer de tout réaliser sans framework et librairies. Le problème est d'enregistrer sur le disque les fichiers reçus par formulaire multi form data html. Non pas à cause de la réception et parsing de ces données, mais qu'on reçoit une grande chaine de caractère comme montré plus bas, et que je ne sais pas comment enregistrer ce fichier sous le bon encodage pour que ça marche et n'affiche plus l'erreur : "fichier impossible à ouvrir"
Cet exemple est un formulaire avec deux champs inputs et un fichier jpg en tout dernier :
------WebKitFormBoundaryde6aU6ihpbf1zqFK
Content-Disposition: form-data; name="nom"
De la Tour
------WebKitFormBoundaryde6aU6ihpbf1zqFK
Content-Disposition: form-data; name="prenom"
Jean
------WebKitFormBoundaryde6aU6ihpbf1zqFK
Content-Disposition: form-data; name="myFiles"; filename="monfichier.jpg"
Content-Type: image/jpeg
I$g�p9�����c�#Ӭ��d����\u0019XL� �=i�\u0000�V���\u0000���\u0000\u001a���]�A�z�D]n��\u0011���_�\c�{�\u000b0�\r��)>��t�\u00125���[�h�~\"��:5�W\u0012O���\u001b4�\u0017d~c��ԟ|b�\u0012;���I���\u0000�RԎ��G\u0003�W&�n'Kx���\u0000<�p�9�My&��\u000f\u0014�����l�\"����j\"K�x�$��\u0017NT�H��\u0016���kz����'��\u0018�e\u0015��\u0001\b\u0016\bc�\b�q�\u001c\u0016pwP�i[�F{Ƙ�.�\u001d��w_j[i��c\u001c�vH�yO=EL-�ƼkE�\u001b�]�\b�;��ۜ��/�Z���\u001c�EԈד��w�\f\u0002�\b�*\f~Y�\u000f�캄?\u001cm�ִMV�W��y俖�4\u00009�H#\fq\u0012�X�|��M\u000bV����L�;��t�� (etc...)
------WebKitFormBoundaryde6aU6ihpbf1zqFK
Le fichier est reçu dans une grande chaine de caractères. Mon problème est de l'enregistrer sur le serveur et que cette image soit à nouveau lisible. Aujourd'hui ça me dit "Ce fichier est impossible à ouvrir"
Je parse ce multiform-data avec mon code ci-dessous :
http.createServer((req, res) => {
var data = "";
var obj = this;
req.on('data', function(sample) {
data += sample; // On receptionne tous les morceaux
});
req.on('end', function() { //Quand tout est envoyé...
data = data.split('\r\n'); //... on fait un tableau avec chaque ligne envoyée
var fd = []; //... fd pour formidable, c'est juste un tableau intermédiaire
var tempNumber = -1;
for(let i in data){
if(data[i].slice(0, 6) == "------"){ // ...si la ligne commence par 6 tirets alors c'est une nouvelle variable
tempNumber++;
fd[tempNumber] = [];
continue;
}
fd[tempNumber].push(data[i]); // ... Maintenant ce tableau contient un tableau pour chaque variable, contenant un tableau pour chaque lignes la décrivant
};
fd.pop(); //... on enlève la dernière ligne car c'était "--------" qui servaient à fermer la variable
var fields = {}; // ... Comme dans formidable on mettra les variables dans des objets fields et files
var files = {};
for(let i in fd){
if(fd[i][0].indexOf('filename') == -1){ // On regarde si cette variable est un fichier ou non si il y a un attribut filename
var name = fd[i][0].split("\\").join('');
name = name.slice(name.indexOf(' name')+7);
name = name.slice(0, name.indexOf('"'));
fields[name] = fd[i].slice(2).join('');
}
else{ // Dans ce cas c'est un fichier
var racine = fd[i][0].split("\\").join('');
name = racine.slice(racine.indexOf(' name')+7);
name = name.slice(0, name.indexOf('"'));
var fileName = racine.slice(racine.indexOf(' filename') + 11);
fileName = fileName.slice(0, fileName.indexOf('"'));
var content = fd[i].slice(3).join('');
files[name] = {fileName,content};
fs.writeFile('testtt.jpg', content); //C'est ici qu'il y a un problème quand on sauvegarde ce contenu comme ça dans un fichier il est illisible, pourtant on met tout dans un fichier sans rien oublier. Certainement une question d'encodage
}
}
res.end(JSON.stringify(files)); //J'affiche le résultat pour bien voir si ça a marché et c'est le cas, c'est juste l'enregistrement du fichier qui ne marche pas
});
Comment peut on faire pour enregistrer un fichier reçu en multiform data, depuis la string qu'on reçoit telle quelle ?
Merci infiniment de m'avoir lu jusqu'au bout :')
Je n'ai trouvé personne ne parlant de ce problème car tout le monde suggère directement l'utilisation d'un framework.
C'est hyper intéressant de se pencher là dessuset j'espère que les solutions si on les trouve pourront aider les suivants,
Merci, à bientôt,
Guillaume