NodeJS تعامل تحميل الملف
في Express4 ، لم يتم undefined req.files ؛ الأكثر استخدامًا الآن قد يكون formidable . أنت تعلم أنه يحتوي على حدث progress ، لذلك تشعر بسعادة غامرة. شريط التقدم للنسخة السفلية من IE هو فرصة ؛ حسنًا ، جربه:
النموذج .on ('خطأ' ، الدالة (err) {console.log (err) ؛}) .on ('أجهول' ، function () {console.log ('Aborted') ؛}). n = parseint (parsefloat (BytesReceived/bytesexpected) .Tofixed (2)*100) ؛نعم ، أنت سعيد برؤية وحدة التحكم تطبع سلسلة من قيم التقدم كما هو متوقع ؛ ثم ، اذهب أبعد من ذلك.
form .on ('progress' ، function (bytesreceed ، bytesexpected) {var n = parseint (parsefloat (bytesreceived/bytesexpected) .tofixed (2)*100) ؛ res.write ('<script> window.call ('+n+') }) ؛ طريقة call هي عرض قيمة التقدم في الصفحة ؛ لسوء الحظ ، يمكنك رؤية آخر 100 ٪ فقط ، ولا يمكنك رؤية قيمة التقدم التفصيلية المحددة المحملة ؛ استكشف مرة أخرى ...
بعد ذلك ، دعنا نغير الفكرة ، وتجربها ، وحفظ قيمة التقدم في session ، وأضف طلبًا إضافيًا لاستطلاع قيمة التقدم. أوه ، هذا ليس سيئًا! من أجل التأكد من أن قيمة التقدم التي تطلبها هي قيمة التقدم التي تقوم بتحميلها هذه المرة بدلاً من قيمة التقدم للتحميلات الأخرى ، تحتاج إلى الاتفاق على قيمة token في الطلب الذي تم تحميله وفي الطلب الإضافي ؛ الآن سؤال آخر هو كيفية الحصول على هذا token عند الطلب. نظرًا لأن هيئة طلب تحميل الملف في Request Payload ، لا يمكن req.body الحصول على القيمة التي يتم تقديمها ، ولا أريد تحليل هذه الوبر ، بالطبع لا يمكنني تحليلها أيضًا ؛ من الأفضل وضعه في url ، والمشكلة هي أنه في بعض الأحيان يجب عليك التحديث مرتين لتحديث token ، وهو أمر غير جيد! كملاذ أخير ، سأضعه في cookie !
var cookies = function () {var cks = req.headers.cookie.split ('؛') ، obj = {} ؛ لـ (var i = 0 ؛ i <cks.length ؛ i ++) {obj [cks [i] .split ('=') [0] .replace (// s+/ig ، '')] = unescape (cks [i] .split ('=') [1]) ؛ } إرجاع OBJ ؛ } () ؛ var querytoken = ملفات تعريف الارتباط .__ token__ ؛ form .on ('Progress' ، function (bytesreceed ، bytesexpected) {var n = parseint (parsefloat (form.bytesreceived/form.bytesexpected) .tofixed (2)*100) ؛ if (req.session ['file'+querytoken]) req.session ['file'+querytoken] = {token: querytoken ، النسبة المئوية: n}} ؛ل IE789 ، جئت للاستطلاع لقيمة التقدم. أسامحني ، لكن قلبي يؤلمني.
var getData = function () {$ .post ('/uploader' ، {getFileInfo: 1 ، UploadToken: utils.cookie.getCoOkie ('__ token__')}) .Then (function (data) {console.log (data) ؛ if (data.mes <0) call (pros.pery) ؛ } getData () ؛ طريقة call هي عرض قيمة التقدم في الصفحة ؛ لسوء الحظ ، يمكنك رؤية آخر 100 ٪ فقط ، ولا يمكنك رؤية قيمة التقدم التفصيلية المحددة المحملة ؛ استكشف مرة أخرى ...
حسنًا ، لقد سقطت مرة أخرى ؛ لكنني ما زلت أشعر أن هناك خطأ ما ، لا توجد مشكلة مع اقتراح أياكس. المشكلة هي أن session يجب أن تنتظر حتى يتم اكتمال التحميل قبل أن يكون لها قيمة ، لذلك لا يمكنني رؤية 100 ٪ فقط ، ولا يمكنني رؤية قيمة التقدم التفصيلية ؛ هل يمكنني أن أعتقد أنه في التقدم ، تم تعليق res.write السابق و req.session ، لكنه يحفظ نتائج كل تنفيذ حتى يتم إصدار progress ، لذلك لا يمكنني رؤية 100 ٪ إلا ؛ أنا لست في حالة مزاجية لقراءة رمز المصدر formidable ، بالطبع لا أستطيع فهمه ، لذلك أعتقد ذلك أولاً!
نظرًا لأن ajax Solling على ما يرام ، فليس من السهل حفظه في session . إذا لم ينجح الأمر حقًا ، فحاول ذلك في global . لن يكون قادرًا على وضع قيمة في الكائن العالمي وسوف يعلقها. إذا قام بتغيير طفيف ، فسيتم وضعه في global :
form .on ('progress' ، function (bytesreceived ، bytesexpected) {var n = parseint (parsefloat (form.bytesreceived/form.bytesexpected) .tofixed (2)*100) ؛ if (global ['file'+querytoken] {global ['file' Global ['file'+queryToken] = {token: querytoken ، في المئة: n}} ؛مواصلة الاقتراع.
جميل ، هذا كل شيء! ما أراه في Chrome هو نفس تقدم HTML5 ، لكنه سيشعر بالتعثر قليلاً في IE789 ، ولكن لا يزال بإمكانك رؤية قيمة التقدم التفصيلية ؛ بعد كل شيء ، المتصفحات القديمة ليست جيدة ، كما تعلمون ؛ وفي كل مرة تقوم فيها بالتحميل ، تضع القيمة في global ، لذلك عليك تنظيفها بشكل مناسب. بعد تحميل الملف ، يمكنك نقله إلى الدليل المحدد global['file'+queryToken]=null ؛
ومع ذلك ، فإن الاقتراع يعني العديد من الطلبات تلو الأخرى ، وقد تكون هناك مشاكل هنا ؛ إذا لم تقصرها ، يتم طلب قيمة التقدم بمجرد كل فاصل 500 مللي ثانية ؛ حسنًا ، يتم حل شريط التقدم IE789 على هذا النحو ، ويتم الاتفاق على التخلص من الفلاش ؛ على الرغم من أن هذا الاقتراع متوافق مع جميع المتصفحات ، إلا أنه لا يزال مضيعة للعديد من الطلبات. دعنا نصدر حكمًا ، واصل HTML5 خارج IE789!
في الواقع ، إذا قمت بقياسه ، فما هو أكثر جدارة ، بالإضافة إلى تحميل وميض واحد أو طلب إضافي؟ سامحني لعدم فهم الفلاش ، لن أقول الكثير. على أي حال ، لا أرغب في إضافة ملفات إضافية إلى الصفحة ؛
لخص
لا يزال هناك العديد من التفاصيل حول مكونات تحميل الملف. أردت في الأصل إنشاء ملف JS ، لكنني اعتقدت لاحقًا أنه لكي أكون أكثر قابلية لإعادة الاستخدام ، سيكون من الأفضل القيام بذلك كصفحة مستقلة. إذا كنت بحاجة إلى تحميله ، فكل ما هو أفضل بكثير من إنشاء ملف JS. ما سبق هو المحتوى الكامل لهذه المقالة. آمل أن يساعدك في دراستك أو عملك. إذا كان لديك أي أسئلة ، فيمكنك ترك رسالة للتواصل.