โพสต์บน Oschina นั่นเป็นของฉันและตอนนี้อยู่ที่นี่ฮ่าฮ่า
รหัสนี้สามารถอัปโหลดได้ทีละไฟล์เท่านั้น ~~
การคัดลอกรหัสมีดังนี้:
var path = ต้องการ ("เส้นทาง");
var fs = ต้องการ ("fs");
var http = ต้องการ ("http");
// post payload ค่า
var getfield = function (ฟิลด์, ค่า) {
ส่งคืน 'การกระจายเนื้อหา: Form-Data; name = "'+ฟิลด์+'"/r/n/r/n'+value+'/r/n';
-
// ไฟล์ payload
var getfieldhead = function (ฟิลด์, ชื่อไฟล์) {
var filefieldhead = 'เนื้อหา-การจัดสรร: form-data; name = "'+field+'"; /n/r/n ';
ส่งคืน Filefieldhead;
-
// รับ MIME
var getMime = function (ชื่อไฟล์) {
var mimes = {
'.png': 'image/png',
'.gif': 'image/gif',
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.js': 'แอปพลิเคชัน/json',
'.Torrent': 'แอปพลิเคชัน/อ็อกเท็ต-สตรีม'
-
var ext = path.extName (ชื่อไฟล์);
var mime = mimes [ext];
mime = !! mime? mime: 'application/octet-stream';
คืนมรณะ;
-
// รับสตริงสุ่มตรวจสอบขอบเขต
var getBoundary = function () {
var max = 9007199254740992;
var dec = math.random () * สูงสุด;
var hex = dec.toString (36);
var boundary = hex;
เขตแดนกลับ;
-
// รับขอบเขต
var getBoundaryBorder = function (ขอบเขต) {
return '-'+boundary+'/r/n';
-
// การจัดรูปแบบฟิลด์
ฟังก์ชั่น fieldpayload (opts) {
var payload = [];
สำหรับ (var id ใน opts.field) {
payload.push (getfield (id, opts.field [id]));
-
payload.push ("");
ส่งคืน payload.oin (getBoundaryBorder (opts.boundary));
-
// โพสต์ข้อมูล
ฟังก์ชั่น postrequest (opts) {
filereadstream (opts, function (buffer) {
ตัวเลือก var = ต้องการ ('url'). parse (opts.url);
ส่วนหัว var = {};
var h = getBoundaryBorder (opts.boundary);
var e = fieldpayload (opts);
var a = getFieldhead (opts.param, opts.file);
var d = "/r/n"+h;
ส่วนหัว ["ความยาวเนื้อหา"] = buffer.byTelength (h+e+a+d)+buffer.length;
ส่วนหัว ["เนื้อหาประเภท"] = 'multipart/form-data;
ตัวเลือกเฮดเดอร์ = ส่วนหัว;
ตัวเลือก method = 'โพสต์';
var req = http.request (ตัวเลือก, ฟังก์ชัน (res) {
var data = '';
res.on ('data', ฟังก์ชั่น (ก้อน) {
ข้อมูล+= ก้อน;
-
res.on ('end', function () {
console.log (res.statuscode)
console.log (ข้อมูล);
-
-
req.write (h+e+a); log.diy (h+e+a+บัฟเฟอร์+d);
req.write (บัฟเฟอร์);
req.end (d);
-
-
// อ่านไฟล์
ฟังก์ชั่น filereadstream (opts, fn) {
var readstream = fs.createReadStream (opts.file, {flags: 'r', การเข้ารหัส: null});
var chunks = [];
ความยาว var = 0;
readStream.on ('ข้อมูล', ฟังก์ชั่น (ก้อน) {
ความยาว += chunk.length;
chunks.push (ก้อน);
-
readstream.on ('end', function () {
var buffer = บัฟเฟอร์ใหม่ (ความยาว);
สำหรับ (var i = 0, pos = 0, size = chunks.length; i <size; i ++) {
Chunks [i] .Copy (บัฟเฟอร์, pos);
pos += chunks [i] .length;
-
FN (บัฟเฟอร์);
-
-
// การตั้งค่าทุกชนิด
var opt = {
"url": "http: //xxxx.xx", // url
"ไฟล์": "00.jpg", // ตำแหน่งไฟล์
"param": "ไฟล์", // ชื่อฟิลด์อัปโหลดไฟล์
"ฟิลด์": {// ส่วนที่เหลือของฟิลด์โพสต์
"ลูกค้า": "1",
"ชื่อ": "ตกลง"
-
"ขอบเขต": "---- webkitformboundary"+getBoundary ()
-
postrequest (opt);
-
----- WebKitformboundaryuzkmkaovuuysq1dt/r/n
เนื้อหา--ฟอร์ม: ชื่อ;
ประเภทเนื้อหา: แอปพลิเคชัน/อ็อกเท็ตสตรีม
/r/n
/r/n +ไฟล์/r/n
----- WebKitformboundaryuzkmkaovuuysq1dt/r/n
เนื้อหา-การกระจาย: ฟอร์ม-ข้อมูล;
/r/n
/r/n +value/r/n
----- webkitformboundaryuzkmkaovuuysq1dt--
-
ความคิดเห็นสุดท้ายคือรูปแบบมาตรฐาน "/r/n" หมายถึงสตริงจริง