2010-08-17 20 views
7

से इसे लोड किए बिना किसी छवि का आकार प्राप्त करें क्या इसे किसी वेब सर्वर से लोड करने के बिना किसी छवि का आकार (शायद बाइट्स में इसका आकार) प्राप्त करना संभव है?किसी वेबसर्वर

क्या वेब सर्वर के पास फ़ाइल आकारों के संबंध में सुलभ गुण (फ़ील्ड) हैं? यह लोड किए बिना छवि आकार की जांच करने की अनुमति देगा।

अक्सर जब किसी वेब सर्वर की निर्देशिका किसी ब्राउज़र में लोड होती है, तो यह आपको सर्वर-साइड से प्रत्येक फ़ाइल का आकार बताती है। क्या मैं एएसपी डेवलपर के रूप में, उस डेटा तक पहुंच सकता हूं?

मैं सी # नेट उपयोग कर रहा हूँ 4

संपादित करें: मैं एक ग्राहक के रूप में कार्य कर रहा हूँ और अन्य वेब सर्वर से इस जानकारी का अनुरोध।

हमेशा की तरह किसी भी मदद की सराहना करते हैं। एलेक्स

उत्तर

11

क्या आपका मतलब है कि जब आप सर्वर हैं, या ग्राहक?

यदि आप सर्वर हैं, तो आप इसे किसी भी अन्य फ़ाइल के बारे में बता सकते हैं (मान लीजिए कि छवि स्ट्रीम फ़ाइल से आ रही है)।

new FileInfo(path).Length; 

तुम्हारा मतलब आप क्लाइंट-कोड कर रहे हैं (यदि आप किसी अन्य वेब सर्वर तक पहुँच रहे हैं) यदि

एक HEAD अनुरोध करते हैं। जबकि कुछ सर्वर सही तरीके से व्यवहार नहीं करते हैं, एक सिर के लिए सही प्रतिक्रिया एक जीईटी के लिए काफी समान है, सिवाय इसके कि इकाई नहीं भेजी जाती है।

HTTP/1.1 200 OK 
Server: nginx 
Date: Tue, 17 Aug 2010 01:06:21 GMT 
Content-Type: image/png 
Connection: keep-alive 
Cache-Control: max-age=604800 
Last-Modified: Tue, 13 Jul 2010 06:28:14 GMT 
Accept-Ranges: bytes 
X-Powered-By: ASP.NET 
Content-Length: 18607 

वास्तविक छवि फ़ाइल के ओक्टेट्स द्वारा पीछा किया:

उदाहरण के लिए, स्प्राइट पीएनजी कि इस पृष्ठ पर प्रयोग किया जाता है प्राप्त करने के लिए, ब्राउज़र http://sstatic.net/stackoverflow/img/sprites.png करने के लिए एक प्राप्त जो जवाब में यह परिणाम है।

में प्राप्त परिणामों के बजाय एक प्रमुख करने से:

HTTP/1.1 200 OK 
Server: nginx 
Date: Tue, 17 Aug 2010 01:07:20 GMT 
Content-Type: image/png 
Connection: keep-alive 
Cache-Control: max-age=604800 
Content-Length: 18607 
Last-Modified: Tue, 13 Jul 2010 06:28:14 GMT 
Accept-Ranges: bytes 
X-Powered-By: ASP.NET 
काफी

ही लेकिन इकाई शरीर बिना। इस बिंदु पर हम देख सकते हैं कि छवि वास्तव में इसे डाउनलोड किए बिना 18607 बाइट आकार में है। यह विधि काम नहीं करेगी, हालांकि अगर छवि को टुकड़ा भेजा जाएगा, तब सामग्री-लंबाई को हेडर में नहीं भेजा जाएगा।

संपादित करें:

यह उनका कहना है लायक है, कि chunked सामग्री के साथ कभी कभी आप कोई चारा नहीं पूरी बात डाउनलोड करने के लिए है क्योंकि सर्वर से नहीं बोलेगा आकार जब यह शुरू होता है है, (और यहां तक ​​पता नहीं हो सकता) भेजना। अफसोस की बात है, यह विशेष रूप से बड़ी धाराओं के साथ भी उपयोग की संभावना है। खुशी से, छवियों के साथ इसका उपयोग करने की संभावना नहीं है।

+0

मैं क्लाइंट हां के रूप में कार्य कर रहा हूं। तो फाइलइन्फो काम नहीं करेगा तो मैं देखता हूं। यहां उल्लिखित नुकसान के बावजूद, HEAD जानकारी जाने का तरीका है। – Alex

+1

क्या आपका मतलब 18607 बाइट आकार में नहीं है? – jeffora

+0

एलओएल। मैंने प्रतिलिपि बनाई है इसलिए मैं संभवतः इसे गलत टाइप नहीं कर सका, और फिर मैंने अधिकतम उम्र को गलती से चिपकाया। फिक्स्ड, धन्यवाद। –

2
System.IO.FileInfo fi = new System.IO.FileInfo(filepath); 
fi.Length(); 

अरे, सिर्फ एक संकेत: http://www.google.ca/#hl=en&source=hp&q=c%23+get+file+size&aq=f&aqi=g4g-m2&aql=&oq=&gs_rfai=&fp=e6a957a020d2d8f6

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

यदि सामग्री-लंबाई गुम है, तो मुझे पूरा यकीन है कि यह निर्धारित करने का कोई तरीका नहीं है कि फ़ाइल को डाउनलोड किए बिना HTTP के माध्यम से कितनी बड़ी है। इस तरह की चीज के लिए सामग्री-लंबाई शीर्षलेख का उपयोग किया जाता है।

+0

.. शानदार समाचार। मेरे पास HTTP शीर्षलेख जांच का विचार था, और आपने इसे पूरी तरह से सामग्री-लंबाई के माध्यम से परिभाषित किया है। हम हमेशा किसी भी डोडी हेडर डेटा को छोड़ सकते हैं, लेकिन उम्मीद है कि अधिकांश सामग्री उपलब्ध होगी। धन्यवाद ... आपको बताएगा कि कल जब मैं कार्यान्वित करता हूं तो यह कैसे जाता है। यहां 2.16 बजे !!! :) – Alex

+0

अगर इसे 'ट्रांसफर-एन्कोडिंग: चंक्ड' के साथ भेजा गया है, तो किसी को भी शर्मिंदा न करें, तब तक यह नहीं होना चाहिए (आरएफसी 2119 में पूंजीकृत "जरूरी नहीं है") भेजा जाना चाहिए, और अगर इसे भेजा गया तो यह होना चाहिए अवहेलना करना। –

+0

क्या System.IO.FileInfo वेब डेटा या केवल स्थानीय डेटा के साथ काम करता है? क्या फाइलपाथ यूआरआई हो सकता है? – Alex

1

ऐसे कई वेब सर्वर हैं जो सामग्री-लंबाई फ़ील्ड की सेवा नहीं करते हैं। आपको यह सुनिश्चित करना होगा कि आपका कोड इस पर सहिष्णु है।

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