J'ai rencontré une telle exigence dans mon travail, et j'avais besoin d'utiliser NodeJS pour télécharger des fichiers. Je savais seulement télécharger des fichiers via le navigateur. Si j'utilise NodeJS, il équivaut à simuler le comportement du navigateur. Après Google, j'ai réalisé que le navigateur utilise simplement le protocole HTTP pour transmettre des données au serveur. Le protocole spécifique est "RFC 1867 - téléchargement de fichiers basé sur des formulaires dans HTML". Le téléchargement de fichiers via des formulaires de formulaire sur le navigateur se fait via ce protocole. Nous pouvons d'abord voir quelles données le navigateur envoie au serveur, puis nous pouvons implémenter la fonction de téléchargement en fonction de la copie. En ce qui concerne le téléchargement de fichiers sur les formulaires de formulaire, tout le monde doit être familier avec:
<form action = "http://www.qq.com/" méthode = "post"> <input type = "text" name = "text1" /> <br /> <input type = "text" name = "text2" /> <br /> <input type = "soumed" /> </ form>
Lors de la soumission, vous pouvez voir que les données suivantes sont envoyées au serveur en utilisant Fiddler pour capturer le paquet:
Publier http://www.qq.com/ http / 1.1
Hôte: www.qq.com
Longueur du contenu: 23
Type de contenu: application / x-www-form-urlencoced; Charset = UTF-8
text1 = bonjour et text2 = monde
Il convient de noter que le type de contenu par défaut est par défaut de l'application / x-www-form-urlencoced, de sorte que le message sera codé par URL. Par exemple, "Hello" sera codé en% E4% BD% A0% E5% A5% BD.
Ensuite, examinons comment le formulaire est téléchargé. Tout le monde devrait être familier avec:
<form action = "http://www.qq.com" Method = "Post" EncType = "multipart / form-data"> <input type = "file" name = "myfile" /> <input type = "soume" value = "soumi" /> </ form>
Créez ensuite un nouveau fichier texte upload.txt avec uniquement le mot Hello World et téléchargez-le. Nous utilisons Fiddler pour saisir le package. Nous pouvons constater que l'envoi de données passées est un peu plus compliquée (de nombreuses autres lignes de demande non liées ont été supprimées, telles que le contrôle du cache et les cookies):
Publier http://www.qq.com/ http / 1.1
Hôte: www.qq.com
Longueur du contenu: 199
Type de contenu: multipart / formulaire de forme; Boundary = --- webkitformBoundarywr3x7sxbyqq4zf5g
----- webkitformBoundarywr3x7sxbyqq4zf5g
Disposition de contenu: format de forme; name = "myfile"; filename = "upload.txt"
Type de contenu: texte / simple
Bonjour le monde
----- webKitFormboundaryWr3x7SXBYQQ4ZF5G--
Selon la définition de RFC 1867, nous devons générer un morceau de données limites. Ces données ne peuvent pas apparaître ailleurs dans le contenu. Cela peut être défini par vous-même. L'algorithme de génération de chaque navigateur peut être différent. La limite ci-dessus consiste à séparer les données. Après avoir généré les données séparées, les données séparées peuvent être placées dans le type de contenu à la tête et transmises au serveur, c'est-à-dire le type de contenu ci-dessus: multipart / formulaire de forme; Boundary = --- webKitFormboundaryWr3x7SXBYQQ4ZF5G, en outre, le contenu téléchargé doit être séparé en plusieurs segments avec des données distinctes, et chaque segment de données a le nom de fichier et le nom lors du téléchargement. Le serveur utilise ce nom pour recevoir le fichier et le type de contenu de type de fichier. Dans cet exemple, texte / plain. Si l'image PNG téléchargée est l'image / PNG, c'est l'image / PNG. Après une ligne vierge du type de fichier, le contenu du fichier téléchargé est également facile à comprendre. Dans cet exemple, le fichier texte téléchargé est afin que le contenu puisse être affiché directement. Si le fichier d'image téléchargé est un fichier binaire, le violonateur affiche le code brouillé. Une fois le contenu du fichier se terminant, il y a une ligne vierge plus des données limites.
Après avoir compris les détails du format d'envoi, l'étape suivante consiste à utiliser NodeJS pour le programmer et la mettre en œuvre. Autrement dit, envoyez simplement les données au serveur en fonction du format.
const http = required ('http'); const fs = require ('fs'); // L'adresse du post est un php dans le service local, utilisé pour tester si le téléchargement est une variabilité de var réussie = {hostname: 'localhost', port: 80, path: '/get.php',Method:' post '} // Génération de données séparées Var BoundaryKey = '--- webkitformBoundaryjlvkbqxtii0ygpab'; // Lire le contenu du fichier qui doit être téléchargé fs.readfile ('./ upload.txt', fonction (err, data) {// distinguer le segment de données séparé var upload = '-' + boundaryKey + '/ r / n' + 'content-disposition: form-data; name = "myfile"; filename = "upload.txt" / r / n' + 'Content-Type: Text / PLAIN / R / N / R / N'; Payload + = Data; Payload + = '/ R / N--' + BoundaryKey + '-'; // Envoyer une demande var req = http.Request (Options, fonction (res) {Res.SetEncoding ('utf8'); res.on (Data ', fonction (Chunk) {console.Log. Chunk);});}); req.on ('error', fonction (e) {console.error ("erreur:" + e);}); // Écrivez la frontière, la taille des données à envoyer, et les données elle-même dans la demande req.setheader ('Content-Type', 'multipart / form-data; Boundary = '+ BoundaryKey +' '); req.sethEader (' Content-Length ', Buffer.ByteLength (Payload,' utf8 ')); req.write (Payload); req.end ();});L'objectif de cet article est de comprendre le protocole et de le mettre en œuvre avec du code. Il existe encore de nombreuses optimisations dans l'organisation du code.
Enfin, dans l'Apache local, écrivez simplement un PHP pour enregistrer le fichier téléchargé à utiliser comme test:
<? php $ filepath = './upload.txt' ;move_uploaded_file($_files ·myfile'
De plus, selon RFC 1867, la fonction de téléchargement de plusieurs fichiers peut être réalisée. Cela ne sera pas décrit en détail ici. Si nécessaire, reportez-vous à RFC 1867 pour une implémentation détaillée.
Ce qui précède est le téléchargement de fichiers node.js introduit par l'éditeur. J'espère que ce sera utile à tout le monde. Si vous avez des questions, veuillez me laisser un message et l'éditeur répondra à tout le monde à temps. Merci beaucoup pour votre soutien au site Web Wulin.com!