2010-04-16 12 views
8

मैं जावा का उपयोग कर वेब सर्वर से ज़िप फ़ाइल डाउनलोड कर रहा हूं लेकिन किसी भी तरह से मैं प्रत्येक फ़ाइल में लगभग 2kb खो रहा हूं। मुझे नहीं पता कि क्यों एक ही कोड अन्य प्रारूपों, जैसे, पाठ, एमपी 3 और अतिरिक्त के साथ ठीक काम करता है। किसी भी मदद की सराहना की है? यहां मेरा कोड है। लाइनों को हटाने के लिएजावा का उपयोग कर ज़िप फ़ाइल डाउनलोड करें?

public void download_zip_file(String save_to) { 
    try { 
     URLConnection conn = this.url.openConnection(); 
     conn.setDoOutput(true); 
     conn.setDoInput(true); 
     conn.setRequestProperty("content-type", "binary/data"); 
     InputStream in = conn.getInputStream(); 
     FileOutputStream out = new FileOutputStream(save_to + "tmp.zip"); 

     byte[] b = new byte[1024]; 
     int count; 

     while ((count = in.read(b)) > 0) { 
      out.write(b, 0, count); 
     } 
     out.close(); 
     in.close(); 

    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+1

क्या आपके पास सर्वर पर पूर्ण नियंत्रण है जहां ज़िप फ़ाइल होस्ट की जाती है? यदि आप सामान्य वेबब्रोसर का उपयोग करके ज़िप फ़ाइल डाउनलोड करते हैं तो यह काम करता है? – BalusC

+0

मेरे पास वेब सर्वर तक पहुंच नहीं है लेकिन यह ब्राउज़र पर ठीक काम करता है। मैंने उपयोगकर्ता एजेंट बदल दिया और सब कुछ ठीक काम किया। – Mohamed

+0

ड्रैट, मैंने बिल्कुल जवाब दिया होगा कि एक जवाब में जब आपने पुष्टि की कि यह एक सामान्य ब्राउज़र में ठीक काम करता है :) 'setDoOutput (true)' जिस तरह से POST को अनुरोध विधि सेट करता है। आप सामान्य रूप से इसे शुद्ध फ़ाइल डाउनलोड के लिए उपयोग नहीं करना चाहते हैं। जीईटी के बजाय POST द्वारा अनुरोध किए जाने पर कुछ सर्वर डाउनलोड को अस्वीकार कर देंगे। – BalusC

उत्तर

0

प्रयास करें:

conn.setDoOutput(true); 
conn.setDoInput(true); 
conn.setRequestProperty("content-type", "binary/data"); 
+0

ने ऐसा किया, और कुछ भी नहीं बदला। – Mohamed

3

यह नीचे के रूप में किया जाना चाहिए:

while ((count = in.read(b)) >= 0) 

in.read0 लौट सकते हैं।

+0

पहले से ही ऐसा ही किया है। – Mohamed

+0

कोई फर्क नहीं पड़ता।यदि यह 0 लौटाता है, तो लिखने के लिए बस कुछ भी नहीं है और इस प्रकार लिखने की कोई आवश्यकता नहीं है। – BalusC

+0

हां, यह मायने रखता है। -1 लूप तोड़ना चाहिए और कुछ भी नहीं। – zockman

0

मुझे http से ज़िप फ़ाइलों को डाउनलोड करने में कोई समस्या थी, जो कि मेरे डाउनलोड में http हेडर शामिल थे, लेकिन इससे मेरी फाइलें थोड़ी बड़ी नहीं थीं, इसलिए आपको शायद यह समस्या नहीं है ।

एक साइड नोट के रूप में आप डाउनलोड संबंधित ऐप्स के लिए Apache Commons Net का उपयोग करने पर विचार कर सकते हैं - यह वाकई बहुत अच्छा है।

0

कुछ साल पहले मुझे टॉमकैट (स्मृति के लिए 5.5.25) के पुराने संस्करण के साथ एक समस्या में चलना याद है जो बड़े पैमाने पर डाउनलोड को छोटा कर देगा। हमने इसे 5.5.27 तक अपग्रेड करके तय किया। मुझे यह भी याद है कि एक ही समस्या को टॉमकैट 6.0 रिलीज में पाया गया था और तय किया गया था।

यदि यह आपके लिए कोई घंटी बजता है, तो टॉमकैट परिवर्तन लॉग पर एक नज़र डालें।

0

केवल ज़िप फ़ाइलें, हुह? बहुत अजीब। क्या यह किसी भी सर्वर से है, या सिर्फ यह है? यदि आप फ़ाइल का नाम बदलते हैं (एक्सटेंशन बदलें) क्या आपको वही समस्या मिलती है? कौन सा बाइट गुम हैं? क्या आप वाकई आखिरी 2 के बाइट्स हैं और मध्य/आदि से कुछ हिस्सा नहीं हैं ...?

+0

उन्होंने 45 मिनट पहले एक प्रश्न टिप्पणी में उल्लेख किया था कि वह पहले से ही उपयोगकर्ता को बदलकर काम करने के लिए मिला है। – BalusC

+0

अच्छी तरह से यह अजीब है - मुझे इस विषय में कहीं भी उस प्रभाव पर कोई टिप्पणी नहीं दिखाई दे रही है ... –

2

"while ((count = in.read(b)) > 0) {...}" अनुभाग के ठीक पहले out.flush() और out.close() से पहले रखें।

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