Oschina에 게시, 그게 내 것이고 지금 여기 있습니다. 하하
이 코드는 한 번에 하나의 파일 만 업로드 할 수 있습니다 ~~
코드 사본은 다음과 같습니다.
var path = 요구 ( "경로");
var fs = 요구 ( "fs");
var http = 요구 사항 ( "http");
// 포스트 값 페이로드
var getfield = 함수 (필드, 값) {
return '컨텐츠 예측 : form-data = "'+field+'"/r/n/r/n'+value+'/r/n';
}
// 파일 페이로드
var getfieldhead = function (필드, 파일 이름) {
var filefieldhead = 'content-disposition : form-data = "'+field+'"; /n/r/n ';
반환 파일 필드 헤드;
}
// 마임을 얻습니다
var getMime = function (filename) {
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 (filename);
var mime = Mimes [ext];
Mime = !! Mim? Mime : 'Application/Octet-stream';
리턴 마임;
}
// 경계를 가져옵니다. 무작위 문자열을 확인하십시오
var getBoundary = function () {
var max = 9007199254740992;
var dec = math.random () * max;
var hex = 12 월 TOSTRING (36);
var 경계 = 16 진;
반환 경계;
}
// 경계를 얻습니다
var getBoundaryBorder = function (경계) {
return '-'+boundary+'/r/n';
}
// 필드 형식
함수 FieldPayload (Opts) {
var payload = [];
for (opts.field의 var id) {
payload.push (getfield (id, opts.field [id]));
}
payload.push ( "");
Return Payload.join (GetBoundaryBorder (Opts.Boundary));
}
// 데이터 게시
기능 postrequest (opts) {
filereadstream (opts, function (버퍼) {
var 옵션 = 요구 사항 ( 'url'). 구문 분석 (opts.url);
var 헤더 = {};
var h = getBoundaryborder (opts.boundary);
var e = FieldPayload (Opts);
var a = getfieldhead (opts.param, opts.file);
var d = "/r/n"+h;
헤더 [ "Content-Length"] = buffer.bytelength (h+e+a+d)+buffer.length;
헤더 [ "content-type"] = 'multipart/form-data ='+opts.boundary;
옵션. 헤더 = 헤더;
옵션 .method = 'post';
var req = http.request (옵션, 함수 (res) {
var data = '';
res.on ( 'data', function (chunk) {
데이터+= 청크;
});
res.on ( 'end', function () {
Console.log (res.statuscode)
Console.log (데이터);
});
});
req.write (h+e+a); log.diy (h+e+a+buffer+d);
req.write (버퍼);
req.end (d);
});
}
// 파일을 읽습니다
함수 filereadstream (opts, fn) {
var readStream = fs.CreaterEadStream (opts.file, {flags : 'r', encoding : null});
var chunks = [];
var 길이 = 0;
readstream.on ( 'data', function (chunk) {
길이 += chunk.length;
chunks.push (청크);
});
readstream.on ( 'end', function () {
var 버퍼 = 새로운 버퍼 (길이);
for (var i = 0, pos = 0, size = chunks.length; i <size; i ++) {
청크 [i] .copy (버퍼, pos);
pos += 청크 [i] .length;
}
FN (버퍼);
});
}
// 모든 종류의 설정
var opt = {
"url": "http : //xxxx.xx", // url
"파일": "00.jpg", // 파일 위치
"param": "파일", // 파일 업로드 필드 이름
"필드": {// 나머지 포스트 필드
"클라이언트": "1",
"제목": "OK"
},
"경계": "---- WebKitFormBoundary"+getBoundary ()
}
postrequest (opt);
/*
----- WebKitFormBoundaryuzkmkaovuyysq1dt/r/n
내용화 : filename = "00.jpg"
컨텐츠 유형 : 응용 프로그램/Octet-stream
/r/n
/r/n +파일/r/n
----- WebKitFormBoundaryuzkmkaovuyysq1dt/r/n
내용화 : form-data = "FieldName"
/r/n
/r/n +값/r/n
----- WebKitFormBoundaryuzkmkaovuuysq1dt-
*/
마지막 주석은 표준 형식 "/r/n"은 실제 문자열을 나타내며 시각적으로 조정됩니다.