2008-11-04 8 views
27

मैं स्कूल के लिए एक परियोजना पर काम कर रहा हूं, और मैं एक उपकरण लागू कर रहा हूं जिसका उपयोग वेब से फ़ाइलों को डाउनलोड करने के लिए किया जा सकता है (थ्रॉटलिंग विकल्प के साथ)। बात यह है कि, मेरे पास इसके लिए एक जीयूआई होगा, और मैं JProgressBar विजेट का उपयोग करूँगा, जिसे मैं डाउनलोड की वर्तमान प्रगति दिखाना चाहता हूं। इसके लिए मुझे फ़ाइल के आकार को जानना होगा। फ़ाइल डाउनलोड करने से पहले फ़ाइल का आकार कैसे प्राप्त करें।जावा यूआरएल कनेक्शन: मैं वेब फ़ाइल का आकार कैसे ढूंढ सकता हूं?

उत्तर

36

कोई भी HTTP प्रतिक्रिया सामग्री-लंबाई शीर्षलेख रखने के लिए है, ताकि आप इस मान के लिए URLConnection ऑब्जेक्ट से पूछ सकें।

//once the connection has been opened 
List values = urlConnection.getHeaderFields().get("content-Length") 
if (values != null && !values.isEmpty()) { 

    // getHeaderFields() returns a Map with key=(String) header 
    // name, value = List of String values for that header field. 
    // just use the first value here. 
    String sLength = (String) values.get(0); 

    if (sLength != null) { 
     //parse the length into an integer... 
     ... 
    } 

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

अपडेट: या, अब मैं URLConnection javadoc को पूरी तरह से देखता हूं, तो आप केवल getContentLength() विधि का उपयोग कर सकते हैं।

+1

getContentLength() लिंक नहीं मिला पेज देता है, http://docs.oracle.com/javase/6/ देखना दस्तावेज़/एपीआई/जावा/नेट/URLConnection.html # getContentLength() – Reg

+0

getContentLength हमेशा एक मान वापस नहीं करेगा। उदाहरण के लिए, एक ऐसा अनुरोध करते समय जो एक गतिशील परिणाम देता है जहां सामग्री का आकार पहले से ज्ञात नहीं है। सटीकता के लिए – coderama

4

आप सामग्री की लंबाई (URLConnection.getContentLength()) का उपयोग करना चाहेंगे। दुर्भाग्यवश, यह हमेशा सटीक नहीं होगा, या हमेशा प्रदान नहीं किया जा सकता है, इसलिए इस पर भरोसा करना हमेशा सुरक्षित नहीं होता है।

32

जैसा कि बताया गया है, URLConnection की getContentLength आपकी सबसे अच्छी शर्त है, लेकिन यह हमेशा एक निश्चित लंबाई नहीं देगी। ऐसा इसलिए है क्योंकि HTTP प्रोटोकॉल (और अन्य जिन्हें URLConnection द्वारा दर्शाया जा सकता है) हमेशा लंबाई को व्यक्त नहीं करते हैं।

HTTP के मामले में, गतिशील सामग्री की लंबाई आमतौर पर — में ज्ञात नहीं है जब content-length हेडर सामान्य रूप से भेजा जाएगा। इसके बजाए, एक और शीर्षलेख, transfer-coding, निर्दिष्ट करता है कि "खंडित" एन्कोडिंग का उपयोग किया जाता है। खंडित एन्कोडिंग के साथ, संपूर्ण प्रतिक्रिया की लंबाई निर्दिष्ट नहीं है, और प्रतिक्रिया वापस टुकड़ों में भेजी जाती है, जहां प्रत्येक टुकड़े का आकार निर्दिष्ट होता है। अभ्यास में, सर्वर सर्वलेट से आउटपुट बफर करता है। जब भी बफर भर जाता है, एक और हिस्सा भेजा जाता है। इस तंत्र का उपयोग करके, HTTP असीमित लंबाई की प्रतिक्रिया स्ट्रीमिंग शुरू कर सकता है।

URLConnection के माध्यम से फ़ाइल की लंबाई प्राप्त करने में सक्षम नहीं होने का एक अन्य कारण यह है कि फ़ाइल 2 जीबी से बड़ी है, जो एक सकारात्मक पूर्णांक की सीमा है।

+2

+1। J2SE 1.4 रिटर्न -1 यदि आप URL कनेक्शन कनेक्शन पर सामग्री लंबाई को एक खंडित प्रतिक्रिया के लिए पढ़ते हैं। यह जे 2 एसई 1.3 में मामला नहीं था। –

0

जैसा कि @ एरिक्सन ने कहा था, कभी-कभी "सामग्री-लंबाई:" के बजाय शीर्षलेख "स्थानांतरण-एन्कोडिंग: खंडित" होता है और निश्चित रूप से आपके पास लंबाई के लिए शून्य मान होता है।

उपलब्ध() विधि के बारे में - कोई भी आपको गारंटी नहीं दे सकता कि यह उचित मूल्य वापस कर देगा, इसलिए मैं आपको इसका उपयोग करने की सलाह नहीं देता हूं।

28

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

private int tryGetFileSize(URL url) { 
     HttpURLConnection conn = null; 
     try { 
      conn = (HttpURLConnection) url.openConnection(); 
      conn.setRequestMethod("HEAD"); 
      conn.getInputStream(); 
      return conn.getContentLength(); 
     } catch (IOException e) { 
      return -1; 
     } finally { 
      conn.disconnect(); 
     } 
    } 
+1

मेरे लिए बहुत अच्छा काम करता है, बहुत बहुत धन्यवाद। – z00l

1
//URLConnection connection 

private int FileSize(String url) { 

// this is the method and it get the url as a parameter. 

     // this java class will allow us to get the size of the file. 

     URLConnection con; 

     // its in a try and catch incase the url given is wrong or invalid 

     try{ 

      // we open the stream 

      con = new URL(url).openConnection() 

      return con.getContentLength(); 
     }catch (Exception e){ 

      e.printStackTrace(); 

      // this is returned if the connection went invalid or failed. 

      return 0; 
     } 
    } 
+1

कृपया कोड के ऊपर एक विवरण पोस्ट करें जो आपने समझाया –

+0

कृपया अधिक जानकारी के साथ संपादित करें। केवल कोड और "इसे आज़माएं" उत्तर निराश हैं, क्योंकि उनमें कोई खोज योग्य सामग्री नहीं है, और यह समझाएं कि किसी को "इसे आजमाएं" क्यों चाहिए। हम ज्ञान के लिए संसाधन बनने के लिए यहां एक प्रयास करते हैं। – abarisone

+0

यह संपादित, मैंने इसे खत्म कर दिया। –

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