मुझे निम्न समस्या का सामना करना पड़ा: जब URLConnection
प्रॉक्सी के माध्यम से उपयोग किया जाता है तो सामग्री की लंबाई हमेशा -1
पर सेट होती है।URLConnection प्रॉक्सी के माध्यम से सामग्री लंबाई को सही ढंग से संभाल नहीं करता
सबसे पहले मैं जाँच की है कि प्रॉक्सी वास्तव में Content-Length
रिटर्न (lynx
और wget
भी प्रॉक्सी के माध्यम से काम कर रहे हैं, वहाँ स्थानीय नेटवर्क से इंटरनेट पर जाने के लिए कोई दूसरा रास्ता नहीं है):
$ lynx -source -head ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip
HTTP/1.1 200 OK
Last-Modified: Mon, 09 Jul 2007 17:02:37 GMT
Content-Type: application/x-zip-compressed
Content-Length: 30745
Connection: close
Date: Thu, 02 Feb 2012 17:18:52 GMT
$ wget -S -X HEAD ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip
--2012-04-03 19:36:54-- ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip
Resolving proxy... 10.10.0.12
Connecting to proxy|10.10.0.12|:8080... connected.
Proxy request sent, awaiting response...
HTTP/1.1 200 OK
Last-Modified: Mon, 09 Jul 2007 17:02:37 GMT
Content-Type: application/x-zip-compressed
Content-Length: 30745
Connection: close
Age: 0
Date: Tue, 03 Apr 2012 17:36:54 GMT
Length: 30745 (30K) [application/x-zip-compressed]
Saving to: `WO2003-104476-001.zip'
जावा में मैं ने लिखा है:
URL url = new URL("ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip");
int length = url.openConnection().getContentLength();
logger.debug("Got length: " + length);
और मुझे -1
मिलता है। मैं FtpURLConnection
डिबग करने के लिए शुरू किया और यह पता चला कि आवश्यक जानकारी HttpURLConnection.responses
क्षेत्र लेकिन यह ठीक से वहाँ से आबादी वाले कभी नहीं है अंतर्निहित में है:
(वहाँ हेडर में
Content-Length: 30745
)। जब आप स्ट्रीम पढ़ना शुरू करते हैं या स्ट्रीम पढ़ने के बाद भी सामग्री की लंबाई अपडेट नहीं होती है। कोड:
URL url = new URL("ftp://ftp.wipo.int/pub/published_pct_sequences/publication/2003/1218/WO03_104476/WO2003-104476-001.zip");
URLConnection connection = url.openConnection();
logger.debug("Got length (1): " + connection.getContentLength());
InputStream input = connection.getInputStream();
byte[] buffer = new byte[4096];
int count = 0, len;
while ((len = input.read(buffer)) > 0) {
count += len;
}
logger.debug("Got length (2): " + connection.getContentLength() + " but wanted " + count);
आउटपुट:
Got length (1): -1
Got length (2): -1 but wanted 30745
ऐसा लगता है जैसे कि यह JDK6 में एक बग है, इसलिए मैं नई bug#7168608 खोला है।
- किसी ने मुझसे मदद कर सकते हैं कोड प्रत्यक्ष FTP कनेक्शन, प्रॉक्सी और स्थानीय
file:/
यूआरएल मुझे खुशी होगी के माध्यम से FTP कनेक्शन के लिए सही सामग्री का आकार लौटना चाहिए लिखने के लिए है। - यदि समस्या को हल नहीं किया जा सकता है- जेडीके 6 के साथ, किसी अन्य पुस्तकालय का सुझाव है जो निश्चित रूप से मैंने उल्लेख किए गए सभी मामलों के लिए काम करता है (Apache Http Client?)। जांच करने के लिए मुझे क्या करना होगा
आपको सामग्री की लंबाई क्यों चाहिए? डेटा की वास्तविक धारा सही है? यदि हां, तो आपको सामग्री की लंबाई की आवश्यकता नहीं है, और सब कुछ ठीक काम कर रहा है। – jtahlborn
@jtahlborn: वास्तविक यूआरएल सही है (यह सार्वजनिक एफ़टीपी है ताकि आप भी परीक्षण कर सकें)। मुझे सामग्री की लंबाई ** सीखने की आवश्यकता है ** बिना स्ट्रीम को पढ़ने के ** और इसे स्पष्ट रूप से करना संभव है। –