Postado em Oschina, isso é meu, e agora está aqui, haha
Este código só pode fazer upload de um arquivo por vez ~~
A cópia do código é a seguinte:
var path = requer ("caminho");
var fs = requer ("fs");
var http = requer ("http");
// Carga útil de pós -valor
var getfield = function (campo, valor) {
Retorne 'Content-Disposition: Form-Data; Nome = "' Field+'"/R/N/R/N'+Valor+'/R/N';
}
// ARQUIVA DE ARQUIVO
var getfieldhead = function (campo, nome do arquivo) {
Var FileField = 'Content-Dispot: Form-Data; /n/r/n ';
retornar FileFieldhead;
}
// Obtenha MIME
var getMime = function (nome do arquivo) {
var Mimes = {
'.png': 'imagem/png',
'.gif': 'imagem/gif',
'.jpg': 'imagem/jpeg',
'.jpeg': 'imagem/jpeg',
'.js': 'aplicativo/json',
'.Torrent': 'Application/Octet-stream'
};
var ext = path.extName (nome do arquivo);
var mime = mimes [ext];
MIME = !! MIME? MIME: 'APLICAÇÃO/OCTT-FREAM';
retornar mímica;
}
// Obtenha a string aleatória de verificação de limite
var getBoundery = function () {
var max = 9007199254740992;
var deC = math.random () * max;
var hex = dez.toString (36);
limite var = hex;
limite de retorno;
}
// Obtenha limite
var getBounderyBorder = function (limite) {
return '-'+limite+'/r/n';
}
// formatação de campo
função fieldPayload (opts) {
Var Payload = [];
para (var id em opts.field) {
payload.push (getfield (id, opts.field [id]));
}
payload.push ("");
Retornar Payload.Join (GetBounderyBorder (Opts.Boundary));
}
// Publicar dados
função postrequest (opts) {
filereadstream (opts, função (buffer) {
op options = requer ('url'). parse (opts.url);
var cabeçalho = {};
var h = getBoundaryBorder (opts.boundary);
var e = fieldPayload (opts);
var a = getfieldhead (opts.param, opts.File);
var d = "/r/n"+h;
Cabeçalho ["content-length"] = buffer.byTeLength (h+e+a+d)+buffer.length;
Cabeçalho ["Tipo de conteúdo"] = 'Multipart/Form-Data;
options.Headers = cabeçalho;
options.method = 'post';
var req = http.request (opções, função (res) {
var dados = '';
res.on ('dados', função (chunk) {
dados+= chunk;
});
res.on ('end', function () {
console.log (res.statuscode)
console.log (dados);
});
});
req.write (h+e+a); log.diy (h+e+a+buffer+d);
req.write (buffer);
req.end (d);
});
}
// Leia o arquivo
função filereadstream (opts, fn) {
var readstream = fs.creteReadstream (opts.File, {sinalizadores: 'r', codificação: null});
var chunks = [];
Var comprimento = 0;
readstream.on ('dados', função (chunk) {
comprimento += chunk.length;
pedaços.push (pedaço);
});
readstream.on ('end', function () {
var buffer = novo buffer (comprimento);
for (var i = 0, pos = 0, size = chunks.length; i <tamanho; i ++) {
pedaços [i] .copy (buffer, pos);
POS += pedaços [i] .Length;
}
fn (buffer);
});
}
// Todos os tipos de configurações
var opt = {
"url": "http: //xxxx.xx", // url
"Arquivo": "00.jpg", // Localização do arquivo
"param": "arquivo", // Nome do campo de upload do arquivo
"Field": {// o restante dos campos post
"Cliente": "1",
"Title": "OK"
},
"Limite": "---- webkitformBoundery"+getBoundery ()
}
PostRequest (OPT);
/*
----- webkitformBoundaryuzkmkaovuuysq1dt/r/n
Disposição de conteúdo: Form-Data; Nome = "arquivo";
Tipo de conteúdo: aplicativo/stream de octeto
/r/n
/r/n +arquivo/r/n
----- webkitformBoundaryuzkmkaovuuysq1dt/r/n
Disposição de conteúdo: Form-Data; Nome = "FieldName"
/r/n
/r/n +valor/r/n
----- webkitformBoundaryuzkmkaovuuysq1dt--
*/
O último comentário é que o formato padrão "/r/n" representa a string real.