تم نشره على أوشينا ، هذا لي ، والآن هنا ، هاها
يمكن لهذا الرمز تحميل ملف واحد فقط في وقت واحد ~~
نسخة الكود كما يلي:
VAR PATH = مطلوب ("المسار") ؛
var fs = require ("fs") ؛
var http = require ("http") ؛
// حمولة ما بعد القيمة
var getfield = function (الحقل ، القيمة) {
إرجاع "تحديد المحتوى: form-data ؛
}
// حمولة الملف
var getfieldhead = function (الحقل ، اسم الملف) {
var filefieldhead = 'content-disposition: form-data ؛ /n/r/n '؛
إرجاع FileFieldhead ؛
}
// الحصول على mime
var getMime = function (filename) {
var mimes = {
'.png': 'Image/PNG'
'.gif': 'Image/GIF' ،
'.jpg': 'Image/jpeg' ،
'.jpeg': 'Image/jpeg' ،
'.js': 'application/json' ،
".
} ؛
var ext = path.extName (اسم الملف) ؛
var mime = mimes [ext] ؛
mime = !! mime؟ mime: 'application/actet-stream' ؛
العودة mime.
}
// احصل على سلسلة عشوائية تحقق من الحدود
var getBoundary = function () {
var max = 9007199254740992 ؛
var dec = math.random () * max ؛
var hex = dec.ToString (36) ؛
var الحدود = Hex ؛
عودة الحدود
}
// الحصول على الحدود
var getBoundaryBorder = function (boundary) {
إرجاع '-'+الحدود+'/r/n' ؛
}
// تنسيق الحقل
دالة FieldPayload (opts) {
var payload = [] ؛
لـ (var id in opts.field) {
payload.push (getField (id ، opts.field [id])) ؛
}
payload.push ("") ؛
return payload.join (getBoundAryBorder (opts.boundary)) ؛
}
// نشر البيانات
وظيفة postrequest (OPTS) {
FileReadStream (opts ، الوظيفة (العازلة) {
خيارات var = 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 ؛
header ["content-length"] = buffer.byteLength (h+e+a+d)+buffer.length ؛
header ["content-type"] = 'multipart/form-data ؛
Options.Headers = header ؛
Options.method = 'post' ؛
var req = http.request (الخيارات ، الدالة (الدقة) {
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.createadStream (opts.file ، {flags: 'r' ، الترميز: null}) ؛
var قطع = [] ؛
var length = 0 ؛
readstream.on ('Data' ، function (chunk) {
طول += chunk.length ؛
chunks.push (قطعة) ؛
}) ؛
readstream.on ('end' ، function () {
var buffer = new Buffer (length) ؛
لـ (var i = 0 ، pos = 0 ، size = kunks.length ؛ i <size ؛ i ++) {
قطع [i] .copy (العازلة ، pos) ؛
POS += قطع [i]. الطول ؛
}
FN (العازلة) ؛
}) ؛
}
// جميع أنواع الإعدادات
var opt = {
"url": "http: //xxxx.xx" ، // url
"ملف": "00.jpg" ، // موقع الملف
"param": "file" ، // file تحميل الحقل اسم حقل
"الحقل": {// بقية حقول البريد
"العميل": "1" ،
"العنوان": "حسنًا"
} ،
"الحدود": "---- webkitformboundary"+getBoundary ()
}
postrequest (OPT) ؛
/*
----- webkitformboundaryuzkmkaovuysq1dt/r/n
Disposition: Form-Data ؛
نوع المحتوى: التطبيق/الثمانية
/ص/ن
/r/n +ملف/r/n
----- webkitformboundaryuzkmkaovuysq1dt/r/n
تحديد المحتوى: اسم النموذج ؛
/ص/ن
/r/n +value/r/n
----- webkitformboundaryuzkmkaovuysq1dt--
*/
التعليق الأخير هو أن التنسيق القياسي "/r/n" يمثل السلسلة الفعلية.