2015-05-03 7 views
15

क्षमा करें अगर यह मामूली या स्पष्ट है, लेकिन मुझे इसे गुगल करके जवाब नहीं मिला।

size$_FILES['name'] सरणी में से कहां से आता है? क्या आप इसके मूल्य पर भरोसा कर सकते हैं ($_FILES['name']['size']) या क्या आपको अभी भी filesize() फ़ंक्शन का उपयोग करके जांचना चाहिए?

दूसरे शब्दों में, यह वास्तविक फ़ाइल आकार को filesize फ़ंक्शन द्वारा जांचना आवश्यक है कि यह ठीक से अपलोड हो गया है या नहीं?

+0

संभावित डुप्लिकेट [$ \ _ FILES \ [... \] \ ['size' \] जाली जा सकती है?] (Http://stackoverflow.com/questions/24564656/can-files-size-be- जाली) –

उत्तर

11

यदि फ़ाइल सही तरीके से अपलोड की गई है और सबकुछ ठीक है, तो आप PHP superglobal $_FILES द्वारा प्रदान की गई जानकारी का उपयोग कर सकते हैं। filesize() का उपयोग छोटे ओवरहेड को जोड़ता है क्योंकि ओएस को आकार के लिए फ़ाइल का निरीक्षण करने की आवश्यकता होती है। यह आप पर निर्भर है, लेकिन यह PHP स्रोत की जांच कर रहा है कि यह सब कैसे करता है यह स्पष्ट रूप से इंगित करता है कि यह HTTP मल्टीपार्ट अनुरोध में फ़ाइल आकार की सही गणना करता है। असल में, यदि आप filesize() फ़ाइल में थे, तो आप एक ही काम फिर से कर रहे होंगे।

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

9

PHP अपलोड होने के बाद फ़ाइल के आकार को फिर से समझने लगता है। हालांकि क्लाइंट परीक्षण के आधार पर फ़ाइल के content-length को निर्दिष्ट करने वाला हेडर भेजता है (PHP 5.5 के साथ) इस हेडर को केवल अनदेखा किया जाता है और इसके बजाए, लंबाई मापा जाता है। निजी तौर पर, मैं फ़ाइल आकार प्राप्त करने के लिए हमेशा filesize() का उपयोग करता हूं क्योंकि आप किस माप के उपयोग के बारे में अधिक आत्मविश्वास से हो सकते हैं, लेकिन यह अंततः आपके ऊपर है। किसी भी तरह से, $_FILES['file_name']['size'] उपयोग करने के लिए एक सुरक्षित मूल्य प्रतीत होता है।

+2

क्या आप निश्चित हैं? मेरी समझ से [स्रोत कोड मल्टीपार्ट HTTP अनुरोधों को पार्स करने के लिए ज़िम्मेदार] [https://github.com/php/php-src/blob/master/main/rfc1867.c), परिणामस्वरूप * आकार * की संख्या को दर्शाता है मल्टीपार्ट भाग निकाय से बाइट पढ़ा जाता है। – Gumbo

+0

@ गंबो दिलचस्प, मैंने जो पढ़ा है, उससे क्लाइंट द्वारा निर्दिष्ट किया गया है, जबकि 'upload_max_filesize' मापे गए गिनती को अपलोड होने के रूप में उपयोग करता है। मैं कुछ परीक्षण करने की कोशिश करूंगा और आपको वापस ले जाऊंगा। – Anonymous

+1

@ गम्बो यूप, आप बिल्कुल सही हैं। PHP अपलोड होने के बाद इसे फिर से समझना प्रतीत होता है। – Anonymous

4

आपको यह जांचना चाहिए कि क्लाइंट-रिपोर्ट $_FILES['file_name']['size']filesize() द्वारा दिए गए मान के बराबर है या नहीं। एक अंतर अपलोड की गई फाइल के संचरण के दौरान एक त्रुटि का संकेत हो सकता है।

संबंधित मुद्दे