2012-10-09 7 views
12

में यूआरएल से फ़ाइल आकार की गणना कैसे करें मैं वेब सेवा से पीडीएफ लिंक का एक समूह प्राप्त करने का प्रयास कर रहा हूं और मैं उपयोगकर्ता को प्रत्येक लिंक का फ़ाइल आकार देना चाहता हूं।जावा

क्या इस कार्य को पूरा करने का कोई तरीका है?

धन्यवाद

+0

मुझे डर है कि आपको सटीक आकार प्राप्त करने के लिए कम से कम एक बार फ़ाइल डाउनलोड करनी होगी। (आप भविष्य के लिए स्टोर करना चाहते हैं, लेकिन यदि सर्वर पर फ़ाइलें बदलती हैं तो डेटा बाँध जाएगा) – Nishant

+1

@ निशांत यह सच नहीं है। एक 'HTTP HEAD' अनुरोध आपको 'HTTP GET' अनुरोध करने पर प्राप्त होने के बारे में जानकारी देता है, जिसमें लौटाए गए अनुरोध का आकार शामिल होना चाहिए। आप निश्चित रूप से 'हेड' अनुरोध कर सकते हैं और प्रतिक्रिया का विश्लेषण कर सकते हैं। – Thor84no

+1

आह, ठीक है। जानकर अच्छा लगा। धन्यवाद @ Thor84no – Nishant

उत्तर

22

एक HEAD अनुरोध का उपयोग करना, आप कुछ इस तरह कर सकते हैं:

private static int getFileSize(URL url) { 
    URLConnection conn = null; 
    try { 
     conn = url.openConnection(); 
     if(conn instanceof HttpURLConnection) { 
      ((HttpURLConnection)conn).setRequestMethod("HEAD"); 
     } 
     conn.getInputStream(); 
     return conn.getContentLength(); 
    } catch (IOException e) { 
     throw new RuntimeException(e); 
    } finally { 
     if(conn instanceof HttpURLConnection) { 
      ((HttpURLConnection)conn).disconnect(); 
     } 
    } 
} 
+0

मौजूद नहीं हो सकता है मुझे नीचे अपवाद मिला: java.io.IOException: सर्वर ने HTTP प्रतिक्रिया कोड लौटाया: URL के लिए 405। मैं ब्राउज़र में पीडीएफ लिंक खोलने के लिए ablo हूँ। क्या इसका मतलब यह है कि यह यूआरएल सिर अनुरोध की अनुमति नहीं देगा? – javaMan

+1

क्या आप अपना अनुरोध यूआरएल साझा कर सकते हैं? –

+0

मुझे खेद है ... यूआरएल को मेरे प्रमाण पत्र की आवश्यकता है। मैं इसे साझा नहीं कर सकता। :( – javaMan

6

HTTP HEAD विधि का उपयोग करने का प्रयास करें। यह केवल HTTP शीर्षलेख देता है। शीर्षलेख Content-Length में आपकी आवश्यक जानकारी होनी चाहिए।

2

क्या आपने यूआरएल कनेक्शन पर getContentLength का उपयोग करने के लिए पहले से ही प्रयास किया है? यदि सर्वर एक वैध शीर्षलेख का जवाब देता है तो आपको दस्तावेज़ का आकार प्राप्त करना चाहिए।

लेकिन इस तथ्य से अवगत रहें कि वेबसर्वर भी फाइलों को फाइलों में वापस कर सकता है। इस मामले में आईआईआरसी सामग्री लंबाई विधि या तो एक खंड (< = 1.4) या -1 (> 1.4) के आकार को वापस कर देगी।

3

HTTP प्रतिक्रिया, एक सामग्री-लंबाई हेडर है तो आप इस मूल्य के लिए URLConnection वस्तु क्वेरी सकता है।

एक बार यूआरएल कनेक्शन खोल दिया गया है, तो आप कुछ इस तरह की कोशिश कर सकते हैं:

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... 
     ... 
    } 
} 
0

आप इस कोशिश कर सकते हैं ..

private long getContentLength(HttpURLConnection conn) { 
    String transferEncoding = conn.getHeaderField("Transfer-Encoding"); 
    if (transferEncoding == null || transferEncoding.equalsIgnoreCase("chunked")) { 
     return conn.getHeaderFieldInt("Content-Length", -1); 
    } else { 
     return -1; 
    } 
3

स्वीकार किए जाते हैं जवाब, NullPointerException की संभावना है नहीं है फाइलों के लिए काम> 2 जीआईबी और getInputStream() पर एक अनावश्यक कॉल शामिल है। यहां तय कोड है:

public long getFileSize(URL url) { 
    HttpURLConnection conn = null; 
    try { 
    conn = (HttpURLConnection) url.openConnection(); 
    conn.setRequestMethod("HEAD"); 
    return conn.getContentLengthLong(); 
    } catch (IOException e) { 
    return -1; 
    // Or wrap into a (custom, if desired) RuntimeException so exceptions are propagated. 
    // throw new RuntimeException(e); 
    // Alternatively you can just propagate IOException, but, urgh. 
    } finally { 
    if (conn != null) { 
     conn.disconnect(); 
    } 
    } 
}