Publié sur Oschina, c'est à moi, et maintenant c'est ici, haha
Ce code ne peut télécharger qu'un seul fichier à la fois ~~
La copie de code est la suivante:
var path = require ("path");
var fs = require ("fs");
var http = require ("http");
// la charge utile de la valeur publique
var getField = fonction (champ, valeur) {
return 'Content-Disposition: form-data; name = "' + champ + '" / r / n / r / n' + valeur + '/ r / n';
}
// Fichier la charge utile
var getFieldhead = fonction (champ, nom de fichier) {
var FileFieldhead = 'Content-Disposition: Form-data; / n / r / n ';
return filefieldhead;
}
// Obtenez du mime
var getMime = function (nom de fichier) {
var mimes = {
'.png': 'image / png',
'.gif': 'image / gif',
'.jpg': 'image / jpeg',
'.jpeg': 'image / jpeg',
'.js': 'application / json',
'.torrent': 'Application / Octet-Stream'
};
var ext = path.ExtName (nom de fichier);
var mime = mimes [ext];
MIME = !! MIME? MIME: «Application / Octet-Stream»;
retour de mime;
}
// Obtenez la limite de vérification aléatoire
var getBoundary = function () {
var max = 9007199254740992;
var dec = math.random () * max;
var hex = déc.ToString (36);
Var Boundary = Hex;
limite de retour;
}
// Obtenez la limite
var getBoundaryborder = fonction (limite) {
return '-' + limite + '/ r / n';
}
// Formatage sur le terrain
fonction fieldpayload (opts) {
Var Payload = [];
pour (var id dans opts.field) {
Payload.push (getField (id, opts.field [id]));
}
Payload.push ("");
Retour Payload.join (GetBoundaryBorder (Opts.Boundary));
}
// Poster les données
Fonction PostRequest (opts) {
fileReadStream (opts, fonction (tampon) {
var options = require ('url'). parse (opts.url);
var header = {};
var h = getBoundaryborder (opts.boundary);
var e = fieldpayload (opts);
var a = getFieldhead (opts.param, opts.file);
var d = "/ r / n" + h;
En-tête ["Content-Length"] = Buffer.ByteLength (H + E + A + D) + Buffer.Length;
En-tête ["Content-Type"] = 'Multipart / Form-data; Boundary =' + Opts.Boundary;
options.heders = en-tête;
options.method = 'post';
var req = http.request (options, fonction (res) {
var data = '';
res.on ('data', fonction (chunk) {
data + = chunk;
});
res.on ('end', function () {
console.log (res.staturuscode)
console.log (données);
});
});
req.write (h + e + a); log.diy (h + e + a + tampon + d);
req.write (tampon);
req.end (d);
});
}
// Lire le fichier
fonction fileReadStream (opts, fn) {
var readStream = fs.creareAdStream (opts.file, {flags: 'r', coding: null});
var chunks = [];
var longueur = 0;
readStream.on ('data', fonction (chunk) {
longueur + = chunk.length;
Chunks.push (morceau);
});
readStream.on ('end', function () {
var tampon = nouveau tampon (longueur);
pour (var i = 0, pos = 0, size = chunks.length; i <size; i ++) {
morceaux [i] .copy (tampon, pos);
pos + = morceaux [i] .length;
}
fn (tampon);
});
}
// toutes sortes de paramètres
var opt = {
"URL": "http: //xxxx.xx", // url
"Fichier": "00.jpg", // Emplacement du fichier
"param": "fichier", // le nom de champ de téléchargement de fichiers
"champ": {// le reste des champs de poste
"Client": "1",
"Titre": "OK"
},
"Boundary": "---- webkitformBoundary" + getBoundary ()
}
PostRequest (OPT);
/ *
----- webkitformboundaryuzkmkaovUUysq1dt / r / n
Disposition de contenu: formulaire de formulaire;
Type de contenu: application / trace d'octet
/ r / n
/ r / n + fichier / r / n
----- webkitformboundaryuzkmkaovUUysq1dt / r / n
Disposition de contenu: formulaire de formulaire;
/ r / n
/ r / n + valeur / r / n
----- webkitformBoundaryuzkmkaovUUysq1dt--
* /
Le dernier commentaire est que le format standard "/ r / n" représente la chaîne réelle.