"यदि कोई कर्मचारी अपना काम अच्छी तरह से करना चाहता है, तो उसे पहले अपने औजारों को तेज करना होगा।" - कन्फ्यूशियस, "द एनालेक्ट्स ऑफ कन्फ्यूशियस। लू लिंगगोंग"
मुखपृष्ठ > प्रोग्रामिंग > सर्वर और क्लाइंट को अवरुद्ध किए बिना वास्तविक समय में सर्वर में अपलोड की गई फ़ाइल के वर्तमान लेखन आकार को कैसे पढ़ें और प्रतिध्वनि करें?

सर्वर और क्लाइंट को अवरुद्ध किए बिना वास्तविक समय में सर्वर में अपलोड की गई फ़ाइल के वर्तमान लेखन आकार को कैसे पढ़ें और प्रतिध्वनि करें?

2024-11-08 को प्रकाशित
ब्राउज़ करें:365

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

सर्वर और क्लाइंट को ब्लॉक किए बिना वास्तविक समय में सर्वर साइड पर लिखी जा रही अपलोड की गई फ़ाइल के आकार को कैसे पढ़ें और प्रिंट करें?

आइए इस मुद्दे पर विस्तार करें:

वास्तविक समय में फ़ाइल अपलोड की प्रगति प्राप्त करने के लिए, हम इसे फ़ेच के माध्यम से ब्लॉब, फ़ाइल, टाइप्डअरे या ऐरेबफ़र ऑब्जेक्ट से सेट करते हैं () POST अनुरोध में बॉडी ऑब्जेक्ट।

वर्तमान कार्यान्वयन फ़ाइल ऑब्जेक्ट को बॉडी ऑब्जेक्ट को पास किए गए फ़ेच() के दूसरे तर्क के रूप में सेट करता है।

आवश्यकताएँ:

टेक्स्ट/इवेंट-स्ट्रीम के रूप में सर्वर के फ़ाइल सिस्टम पर लिखी जा रही फ़ाइल के आकार को पढ़ता है और इसे क्लाइंट को वापस भेज देता है। रुकता है जब GET अनुरोध में var क्वेरी स्ट्रिंग पैरामीटर द्वारा प्रदान किए गए सभी बाइट्स लिखे गए हैं। फ़ाइल रीडिंग वर्तमान में एक अलग स्क्रिप्टिंग वातावरण में होती है, जहां फ़ाइल को पढ़ने वाली स्क्रिप्ट पर GET कॉल की जाती है, और फिर उस स्क्रिप्ट पर POST किया जाता है जो फ़ाइल को सर्वर पर लिखती है।

वर्तमान फ़ाइल आकार प्राप्त करने के लिए सर्वर-साइड फ़ाइल लिखने या फ़ाइल पढ़ने से संबंधित संभावित समस्याओं को हल करने का प्रयास करने से पहले फ़ाइल आकार इको अनुभाग पूरा होने तक प्रतीक्षा करें।

वर्तमान में आवश्यकताओं को पूरा करने के लिए php का उपयोग करने का प्रयास कर रहा हूं। लेकिन सी, बैश, नोडज, पायथन या अन्य भाषाओं या विधियों में भी रुचि है जिनका उपयोग समान कार्य करने के लिए किया जा सकता है।

क्लाइंट-साइड जावास्क्रिप्ट भाग ठीक है। मैं अनावश्यक भागों को शामिल किए बिना पैटर्न को लागू करने के लिए PHP (दुनिया में सबसे व्यापक रूप से उपयोग की जाने वाली सर्वर-साइड भाषाओं में से एक) में पारंगत नहीं हूं।

प्रेरणा:

लाने के लिए प्रगति संकेतक?

संबंधित:

ReadableStream के साथ प्राप्त करें

समस्या:

प्राप्त करें

PHP Notice:  Undefined index: HTTP_LAST_EVENT_ID in stream.php on line 7

पर स्ट्रीम.php में HTTP_LAST_EVENT_ID।

इसके अतिरिक्त, यदि

while(file_exists($_GET["filename"]) 
  && filesize($_GET["filename"]) < intval($_GET["filesize"]))

को

while(true)
&&& ] यह इवेंटसोर्स पर एक त्रुटि उत्पन्न करेगा।

स्लीप() कॉल के बिना, 3.3 एमबी आकार की फ़ाइल के लिए सही फ़ाइल आकार संदेश ईवेंट पर भेजा जाता है, 3321824, 61921, 26214 और 38093 क्रमशः मुद्रित होते हैं जब एक ही फ़ाइल तीन बार अपलोड की जाती है। अपलोड की गई फ़ाइल ऑब्जेक्ट के फ़ाइल आकार के बजाय:

stream_copy_to_stream($input, $file);
stream_copy_to_stream($input, $file);
पर फ़ाइल लिखते समय अपेक्षित परिणाम फ़ाइल आकार प्राप्त करना है। क्या fopen() या स्ट्रीम_कॉपी_टू_स्ट्रीम() अन्य php प्रक्रियाओं को स्ट्रीम.php तक पहुँचने से रोकेगा?

अब तक आज़माई गई चीज़ें:

php उद्धरण

    $_POST, $_GET और $_FILE से परे: JavaScriptPHP प्रोसेसिंग ब्लॉब में
  • PHP उदाहरण के साथ सर्वर-भेजे गए ईवेंट परिचय
php

// क्या मैं `data.php`, `stream.php` को समान फ़ाइल में मर्ज कर सकता हूँ? // क्या मैं `STREAM_NOTIFY_PROGRESS` का उपयोग कर सकता हूँ // "स्ट्रीम ट्रांसफर की वर्तमान प्रगति को इंगित करता है // बाइट्स_ट्रांसफर और संभवतः बाइट्स_मैक्स में भी" बाइट्स पढ़ने के लिए? // क्या हमें `stream_set_blocking` को `false` पर कॉल करने की आवश्यकता है //data.php
stream_copy_to_stream($input, $file);
// स्ट्रीम.php
stream_copy_to_stream($input, $file);
जावास्क्रिप्ट

प्रगति> const [यूआरएल, स्ट्रीम, हेडर] = ["data.php", "stream.php", "x-filename"]; स्थिरांक [इनपुट, प्रगति, हैंडलफ़ाइल] = [ दस्तावेज़.querySelector("इनपुट[प्रकार=फ़ाइल]") , दस्तावेज़.querySelector("प्रगति") , (घटना) => स्थिरांक [फ़ाइल] = इनपुट.फ़ाइलें; स्थिरांक [{आकार: फ़ाइल आकार, नाम: फ़ाइल नाम}, शीर्षलेख, पैरामीटर] = [ फ़ाइल, नए हेडर(), नए URLSearchParams() ]; // 'स्ट्रीम' यूआरएल के लिए खोज पैरामीटर के रूप में 'फ़ाइल नाम', 'फ़ाइल आकार' सेट करें ऑब्जेक्ट.एंट्रीज़({फ़ाइल नाम, फ़ाइल आकार}) .forEach(([...props]) =>params.append.apply(params,props)); // `POST` के लिए हेडर सेट करें हेडर.एपेंड (हेडर, फ़ाइल नाम); // `progress.value` को रीसेट करें `progress.max` को `filesize` पर सेट करें [प्रगति.मूल्य, प्रगति.अधिकतम] = [0, फ़ाइल आकार]; स्थिरांक [अनुरोध, स्रोत] = [ नया अनुरोध(यूआरएल, { विधि:"पोस्ट", हेडर:हेडर, बॉडी:फ़ाइल }) // https://stackoverflow.com/a/42330433/ , नया इवेंटसोर्स(`${stream}?${params.toString()}`) ]; source.addEventListener("संदेश", (ई) => { // यहां 'प्रगति' अपडेट करें, // जब `e.data === फाइल साइज` हो तो `.close()` को कॉल करें // `progress.value = e.data`, इतना सरल होना चाहिए कंसोल.लॉग(e.data, e.lastEventId); }, सत्य); source.addEventListener("खुला", (ई) => { कंसोल.लॉग ("अपलोड प्रगति खोलें खोलें"); }, सत्य); source.addEventListener("त्रुटि", (e) => { कंसोल.त्रुटि ("अपलोड प्रगति त्रुटि प्राप्त करें"); }, सत्य); // परीक्षणों के लिए विवेक जांच, // जब `e.data === filesize` हो तो हमें `source` की आवश्यकता नहीं है; // हम `मैसेज` इवेंट हैंडलर के भीतर `.close()` को कॉल कर सकते हैं सेटटाइमआउट(() => source.close(), 30000); // हमें 'वादा' श्रृंखला में होने के लिए 'स्रोत' की आवश्यकता नहीं है, // हालाँकि हम इसका समाधान कर सकते हैं यदि `e.data === filesize` // `प्रतिक्रिया` से पहले, फिर `.text()` आदि की प्रतीक्षा करें; // कार्य: यदि और कहां विलय करना है या `इवेंटसोर्स` को शाखा देना है, // एकल या दो `प्रॉमिस` श्रृंखलाओं के लिए `फ़ेच` करें कॉन्स्ट अपलोड = फ़ेच (अनुरोध); अपलोड करें .तब(प्रतिक्रिया => प्रतिक्रिया.पाठ()) .then(res => कंसोल.लॉग(res)) .catch(err => console.error(err)); } ]; इनपुट.एडइवेंटलिस्टनर ("परिवर्तन", हैंडलफ़ाइल, सत्य); स्क्रिप्ट>
विज्ञप्ति वक्तव्य यह लेख यहां पुनर्मुद्रित है: 1729432843 यदि कोई उल्लंघन है, तो कृपया इसे हटाने के लिए स्टडी_गोलंग@163.कॉम से संपर्क करें।
नवीनतम ट्यूटोरियल अधिक>

चीनी भाषा का अध्ययन करें

अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।

Copyright© 2022 湘ICP备2022001581号-3