","image":"http://www.luping.net/uploads/20241104/17307198076728b03faccae.jpg","datePublished":"2024-11-08T22:31:00+08:00","dateModified":"2024-11-08T22:31:00+08:00","author":{"@type":"Person","name":"luping.net","url":"https://www.luping.net/articlelist/0_1.html"}}
"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > كيف يمكن قراءة حجم الملف الذي تم تحميله في الخادم وصدى حجمه الذي يتم كتابته حاليًا في الوقت الفعلي دون حظر الخادم والعميل؟

كيف يمكن قراءة حجم الملف الذي تم تحميله في الخادم وصدى حجمه الذي يتم كتابته حاليًا في الوقت الفعلي دون حظر الخادم والعميل؟

تم النشر بتاريخ 2024-11-08
تصفح:637

How to Read and Echo Currently Writing Size of Uploaded File in Server in Realtime Without Blocking Server and Client?

كيف يمكن قراءة وطباعة حجم الملف الذي تم تحميله والذي يتم كتابته على جانب الخادم في الوقت الفعلي دون حظر الخادم والعميل؟

دعونا نتوسع في هذه المشكلة:

من أجل الحصول على تقدم تحميل الملف في الوقت الفعلي، قمنا بتعيينه من كائن Blob أو File أو TypedArray أو ArrayBuffer من خلال الجلب. () في طلب POST كائن الجسم.

يقوم التنفيذ الحالي بتعيين كائن الملف باعتباره الوسيط الثاني لجلب () الذي تم تمريره إلى كائن النص.

المتطلبات:

حيث يقرأ النص/تدفق الحدث حجم الملف الذي تتم كتابته إلى نظام ملفات الخادم ويعيده إلى العميل. يتوقف عند كتابة كافة وحدات البايت التي توفرها معلمة سلسلة الاستعلام var في طلب GET. تتم قراءة الملفات حاليًا في بيئة برمجة نصية منفصلة، ​​حيث يتم إجراء استدعاءات GET للبرنامج النصي الذي يقرأ الملف، ثم يتم إجراء POST للبرنامج النصي الذي يكتب الملف إلى الخادم.

انتظر حتى تكمل قسم صدى حجم الملف قبل محاولة حل المشكلات المحتملة في التعامل مع عمليات كتابة الملف أو قراءة الملف من جانب الخادم للحصول على حجم الملف الحالي.

أحاول حاليًا استخدام PHP لتلبية المتطلبات. ولكن أيضًا مهتم بـ c أو bash أوnodejs أو python أو غيرها من اللغات أو الأساليب التي يمكن استخدامها لأداء نفس المهمة.

جزء جافا سكريبت من جانب العميل جيد. أنا لست على دراية جيدة بلغة php (واحدة من أكثر لغات الخادم استخدامًا في العالم) لتنفيذ النمط دون تضمين الأجزاء غير الضرورية.

الدافع:

مؤشر التقدم للجلب؟

ذات صلة:

جلب باستخدام ReadableStream

المشكلة:

احصل على

إشعار PHP: فهرس غير محدد: HTTP_LAST_EVENT_ID فيstream.php على السطر 7
PHP Notice:  Undefined index: HTTP_LAST_EVENT_ID in stream.php on line 7
في الوحدة الطرفية.

بالإضافة إلى ذلك، إذا كان

while(file_exists($_GET["filename"]) && &&& ] سيؤدي إلى إنشاء خطأ في EventSource.
PHP Notice:  Undefined index: HTTP_LAST_EVENT_ID in stream.php on line 7
بدون استدعاء Sleep()، يتم إرسال حجم الملف الصحيح إلى حدث الرسالة لملف بحجم 3.3 ميجابايت، وتتم طباعة 3321824 و61921 و26214 و38093 على التوالي عند تحميل نفس الملف ثلاث مرات. النتيجة المتوقعة هي الحصول على حجم الملف عند كتابة ملف على:

stream_copy_to_stream($input, $file);
PHP Notice:  Undefined index: HTTP_LAST_EVENT_ID in stream.php on line 7
بدلاً من حجم ملف كائن الملف الذي تم تحميله. هل سيمنع fopen() أوstream_copy_to_stream() عمليات php الأخرى من الوصول إلىstream.php؟

الأشياء التي تمت تجربتها حتى الآن:

stream_copy_to_stream($input, $file);
php اقتباس من

ما وراء $_POST، $_GET و $_FILE: في JavaScriptPHP Processing Blobمقدمة عن الأحداث المرسلة من الخادم باستخدام مثال PHP

php

    // هل يمكنني دمج `data.php` و`stream.php` في نفس الملف؟ // هل يمكنني استخدام `STREAM_NOTIFY_PROGRESS` // "يشير إلى التقدم الحالي في نقل الدفق // في bytes_transferred وربما bytes_max أيضًا" لقراءة البايتات؟ // هل نحتاج إلى استدعاء "stream_set_blocking" إلى "خطأ". //data.php
  • //stream.php
  • جافا سكريبت

الرأس> const [url,stream, header] = ["data.php", "stream.php", "x-filename"]; ثابت [الإدخال، التقدم، ملف المقبض] = [ document.querySelector("الإدخال[نوع=ملف]") ، document.querySelector("التقدم") , (الحدث) => ثابت [ملف] = input.files؛ const [{الحجم: حجم الملف، الاسم: اسم الملف}، الرؤوس، المعلمات] = [ ملف، رؤوس جديدة ()، URLSearchParams () جديد ]; // قم بتعيين "اسم الملف" و"حجم الملف" كمعلمات بحث لعنوان URL الخاص بالبث Object.entries({اسم الملف, الملف}) .forEach(([...props]) => params.append.apply(params,props)); // تعيين رأس لـ "POST". headers.append(header, filename); // إعادة ضبط "progress.value" وضبط "progress.max" على "حجم الملف". [progress.value,progress.max] = [0, حجم الملف]; ثابت [الطلب، المصدر] = [ طلب جديد (رابط، { الطريقة: "POST"، الرؤوس: الرؤوس، النص: ملف }) // https://stackoverflow.com/a/42330433/ ، مصدر حدث جديد(`${stream}?${params.toString()}`) ]; source.addEventListener("message", (e) => { // تحديث "التقدم" هنا، // اتصل بـ `.Close()` عندما يكون `e.data === حجم الملف` // `progress.value = e.data`، ينبغي أن يكون بهذه البساطة console.log(e.data, e.lastEventId); }، حقيقي)؛ source.addEventListener("open", (e) => { console.log("فتح تقدم التحميل"); }، حقيقي)؛ source.addEventListener("خطأ"، (e) => { console.error("خطأ في جلب تقدم التحميل"); }، حقيقي)؛ // التحقق من سلامة الاختبارات، // لا نحتاج إلى "المصدر" عندما يكون "e.data === حجم الملف"؛ // يمكننا استدعاء `. Close()` داخل معالج الأحداث `message` setTimeout(() => source.إغلاق(), 30000); // لا نحتاج إلى وجود "المصدر" في سلسلة "الوعد"، // على الرغم من أنه يمكننا حل المشكلة إذا كانت `e.data === حجم الملف` // قبل الرد، ثم انتظر `.text()` وما إلى ذلك. // TODO: إذا وأين سيتم الدمج أو التفريع `EventSource`، // "جلب" لسلسلة واحدة أو سلسلتين من سلسلة "الوعد". تحميل ثابت = جلب(طلب); رفع .ثم (الاستجابة => الاستجابة. النص ()) .then(res => console.log(res)) .catch(err => console.error(err)); } ]; input.addEventListener("change", HandleFile, true); الجسم>

بيان الافراج أعيد طبع هذه المقالة على: 1729432843 في حالة وجود أي انتهاك، يرجى الاتصال بـ [email protected] لحذفها
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3