Maison > interface Web > js tutoriel > le corps du texte

Node.js implémente le téléchargement de fichiers

高洛峰
Libérer: 2016-12-24 17:23:20
original
1525 Les gens l'ont consulté

J'ai rencontré une telle demande au travail. J'avais besoin d'utiliser nodejs pour télécharger des fichiers. Avant, je savais seulement comment télécharger des fichiers via un navigateur. Utiliser nodejs équivaut à simuler le comportement d'un navigateur. Après quelques recherches sur 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 un formulaire en HTML". le protocole du navigateur, nous pouvons d'abord voir quelles données le navigateur envoie au serveur, puis nous pouvons implémenter la fonction de téléchargement de la même manière. En parlant de formulaire de téléchargement de fichiers, tout le monde devrait le connaître :

<form action="http://www.qq.com/" method="post">
<input type="text" name="text1" /><br />
<input type="text" name="text2" /><br />
<input type="submit" />
</form>
Copier après la connexion

Envoyez des données comme ceci :


POST http://www.qq.com/ HTTP/1.1

Hôte : www.qq.com

Content-Length : 23
Content -Type : application/x-www-form-urlencoded; charset=UTF-8

text1=hello&text2= world

Il convient de noter que Content-Type est par défaut application/x-www-form-urlencoded, le message sera donc codé en URL. Par exemple, « Bonjour » sera codé comme Bonjour.

Voyons ensuite comment télécharger via le formulaire. Tout le monde devrait être familier avec ceci :


<form action="http://www.qq.com" method="post" enctype="multipart/form-data">
<input type="file" name="myfile" />
<input type="submit" value="submit" />
</form>
Copier après la connexion

Créez ensuite un nouveau fichier texte upload.txt avec uniquement les mots bonjour tout le monde et téléchargez-le, nous l'utiliserons Utilisez fiddler pour capturer le package, et vous constaterez que les données envoyées sont un peu plus compliquées (de nombreuses autres lignes de requête non pertinentes ont été supprimées, telles que le contrôle du cache et les cookies) :


POST http : //www.qq.com/ HTTP/1.1

Hôte : www.qq.com

Content-Length : 199
Content-Type : multipart/form-data border=; ----WebKitFormBoundarywr3X7sXBYQQ4ZF5G

------WebKitFormBoundarywr3X7sXBYQQ4ZF5G
Content-Disposition : form-data="myfile" ; /plain

bonjour tout le monde

------WebKitFormBoundarywr3X7sXBYQQ4ZF5G--

Selon la définition de la RFC 1867, nous devons générer une donnée de limite. les données ne peuvent pas apparaître ailleurs dans le contenu. Cela peut être défini vous-même. L'algorithme de génération dans chaque navigateur peut être différent. La limite ci-dessus consiste à séparer les données. Une fois les données séparées générées, les données séparées peuvent être placées dans le contenu. Type de l'en-tête et envoyé au serveur, c'est-à-dire Content-Type ci-dessus : multipart/form-data; border=----WebKitFormBoundarywr3X7sXBYQQ4ZF5G De plus, le contenu téléchargé doit être séparé en plusieurs segments à l'aide de données délimitées, et chacun. Le segment de données contient le nom du fichier. Il y a également le nom lors du téléchargement. Le serveur utilise ce nom pour recevoir le fichier, et le type de fichier Content-Type. Dans cet exemple, il s'agit de text/plain. L'image png est image/png. Une ligne vide après le type de fichier correspond au contenu du fichier téléchargé. Dans cet exemple, pour faciliter la compréhension, un fichier texte est téléchargé, afin que le contenu puisse être affiché directement si un fichier image est téléchargé. est un fichier binaire, fiddler. Il affiche simplement des caractères tronqués. Une fois le contenu du fichier terminé, il y a une ligne vide plus des données de limite.

Après avoir compris les détails du format d'envoi, l'étape suivante consiste à utiliser nodejs pour implémenter la programmation. Pour faire simple, envoyez simplement les données au serveur selon le format.


const http = require(&#39;http&#39;);
const fs = require(&#39;fs&#39;);
//post地址为本地服务的一个php,用于测试上传是否成功
var options = {
hostname: &#39;localhost&#39;,
port: 80,
path: &#39;/get.php&#39;,
method: &#39;POST&#39;
}
//生成分隔数据
var boundaryKey = &#39;----WebKitFormBoundaryjLVkbqXtIi0YGpaB&#39;;
//读取需要上传的文件内容
fs.readFile(&#39;./upload.txt&#39;, function (err, data) {
//拼装分隔数据段
var payload = &#39;--&#39; + boundaryKey + &#39;\r\n&#39; + &#39;Content-Disposition:form-data; name="myfile"; filename="upload.txt"\r\n&#39; + &#39;Content-Type:text/plain\r\n\r\n&#39;;
payload += data;
payload += &#39;\r\n--&#39; + boundaryKey + &#39;--&#39;;
//发送请求
var req = http.request(options, function (res) {
res.setEncoding(&#39;utf8&#39;);
res.on(&#39;data&#39;, function (chunk) {
console.log(&#39;body:&#39; + chunk);
});
});
req.on(&#39;error&#39;, function(e) {
console.error("error:"+e);
});
//把boundary、要发送的数据大小以及数据本身写进请求
req.setHeader(&#39;Content-Type&#39;, &#39;multipart/form-data; boundary=&#39;+boundaryKey+&#39;&#39;);
req.setHeader(&#39;Content-Length&#39;, Buffer.byteLength(payload, &#39;utf8&#39;));
req.write(payload);
req.end();
});
Copier après la connexion
L'objectif de cet article est de comprendre le protocole et de l'implémenter avec du code. Il existe de nombreuses optimisations dans l'organisation du code.

Enfin, dans Apache local, écrivez simplement un php pour enregistrer le fichier téléchargé pour le tester :


<?php
$filePath = &#39;./upload.txt&#39;;
move_uploaded_file($_FILES[&#39;myfile&#39;][&#39;tmp_name&#39;] , $filePath);
echo "ok";
?>
Copier après la connexion
De plus, selon la RFC 1867, vous pouvez également implémenter la fonction de téléchargement de plusieurs fichiers en même temps. Cela ne sera pas décrit en détail ici. Si nécessaire, vous pouvez vous référer à la RFC 1867 pour plus de détails.

Ce qui précède est l'implémentation Node.js du téléchargement de fichiers introduite par l'éditeur. J'espère que cela vous sera utile. Si vous avez des questions, veuillez me laisser un message et l'éditeur vous répondra. à vous à temps. Je voudrais également vous remercier tous pour votre soutien au site Web PHP chinois !


Pour plus d'articles liés à l'implémentation Node.js du téléchargement de fichiers, veuillez faire attention au site Web PHP chinois !


Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!