सर्वर और क्लाइंट को ब्लॉक किए बिना वास्तविक समय में सर्वर साइड पर लिखी जा रही अपलोड की गई फ़ाइल के आकार को कैसे पढ़ें और प्रिंट करें?
आइए इस मुद्दे पर विस्तार करें:
वास्तविक समय में फ़ाइल अपलोड की प्रगति प्राप्त करने के लिए, हम इसे फ़ेच के माध्यम से ब्लॉब, फ़ाइल, टाइप्डअरे या ऐरेबफ़र ऑब्जेक्ट से सेट करते हैं () 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 उद्धरण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)); } ]; इनपुट.एडइवेंटलिस्टनर ("परिवर्तन", हैंडलफ़ाइल, सत्य); स्क्रिप्ट>
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3