Publicado en Oschina, eso es mío, y ahora está aquí, jaja
Este código solo puede cargar un archivo a la vez ~~
La copia del código es la siguiente:
ruta var = requerir ("ruta");
var fs = require ("fs");
var http = require ("http");
// Carga útil del valor post
var getfield = function (campo, valor) {
return 'Content-Disposition: Form-Data;
}
// Archivo de carga útil
var getFieldhead = function (campo, nombre de archivo) {
var fileFieldHead = 'Content-Disposition: Form-Data; /n/r/n ';
return FileFieldhead;
}
// Get Mime
var getMime = function (nombre de archivo) {
var mimes = {
'.png': 'imagen/png',
'.gif': 'Image/gif',
'.jpg': 'Image/jpeg',
'.jpeg': 'Image/jpeg',
'.js': 'Aplicación/JSON',
'.torrent': 'aplicación/octet-stream'
};
var ext = Path.extName (FileName);
var mime = mimes [ext];
mime = !! mime? mime: 'aplicación/octet-stream';
regresar mime;
}
// Obtener la cadena aleatoria de verificación de límite
var getBoundary = function () {
var max = 9007199254740992;
var dec = Math.random () * max;
var hex = dec.tostring (36);
VAR Boundary = hex;
Límite de regreso;
}
// Get Boundary
var getBoundaryBorder = function (límite) {
return '-'+límite+'/r/n';
}
// Formateo de campo
función FieldPayLoad (Opts) {
VAR Payload = [];
for (var id en opts.field) {
Payload.push (getfield (id, opts.field [id]));
}
Payload.push ("");
devolver la carga Pay.Join (GetBoundaryBorder (Opts.Boundary));
}
// Publicar datos
función postrequest (opts) {
FileReadStream (opts, function (buffer) {
VAR OPTIONS = require ('url'). parse (opts.url);
Encabezado var = {};
var h = getBoundaryBorder (opts.boundary);
var e = fieldpayload (opts);
var a = getFieldhead (opts.param, opts.file);
var d = "/r/n"+h;
Encabezado ["Content-longitud"] = buffer.bytelength (H+e+a+d)+buffer.length;
Encabezado ["Content-type"] = 'multipart/form-data;
opciones.headers = encabezado;
opciones.method = 'post';
var req = http.request (opciones, function (res) {
var data = '';
res.on ('Data', Function (Chunk) {
datos+= fragmento;
});
res.on ('end', function () {
console.log (res.statuscode)
console.log (datos);
});
});
req.write (h+e+a); log.diy (h+e+a+buffer+d);
req.write (buffer);
req.end (d);
});
}
// Lee el archivo
función FileReadStream (Opts, Fn) {
var readstream = fs.CreateReadStream (opts.file, {flags: 'r', coding: null});
var fragmentos = [];
longitud var = 0;
readstream.on ('data', function (chunk) {
longitud += chunk.length;
trozos.push (fragmento);
});
readstream.on ('end', function () {
var buffer = new buffer (longitud);
para (var i = 0, pos = 0, size = chunks.length; i <size; i ++) {
trozos [i] .copy (tampón, pos);
pos += fragmentos [i] .length;
}
fn (búfer);
});
}
// Todo tipo de configuraciones
var opt = {
"URL": "http: //xxxx.xx", // url
"Archivo": "00.jpg", // Ubicación del archivo
"Param": "archivo", // nombre de campo de carga de archivo
"Campo": {// El resto de los campos postales
"Cliente": "1",
"Título": "Ok"
},
"Límite": "---- WebKitFormBoundary"+GetBoundary ()
}
postrequest (opt);
/*
----- webkitFormBoundaryuzkmkaovuUysq1dt/r/n
Contenido-Disposición: Formo-Data;
Tipo de contenido: aplicación/octet-stream
/r/n
/r/n +archivo/r/n
----- webkitFormBoundaryuzkmkaovuUysq1dt/r/n
Contenido-Disposición: Form-Data;
/r/n
/r/n +valor/r/n
----- WebKitFormBoundaryUzkmkaovuuysq1dt--
*/
El último comentario es que el formato estándar "/R/N" representa la cadena real.