2010-08-05 13 views
9

मैंने एक प्रोग्राम लिखा है जो कुछ सर्वरों से कुछ फाइलें डाउनलोड करता है।
वर्तमान में प्रोग्राम ठीक से काम करता है।
लेकिन मैं इसे फिर से शुरू करना चाहता हूं।
मैं इस तरह यह कर रहा हूँ लेकिन परिणाम फ़ाइल दूषित है:जावा: यूआरएल कनेक्शन में डाउनलोड करें

.... 

File fcheck=new File(SaveDir+"/"+filename); 
if(resumebox.isSelected() && fcheck.exists()){ 
    connection.setRequestProperty("Range", "Bytes="+(fcheck.length())+"-"); 
} 

connection.setDoInput(true); 
connection.setDoOutput(true); 

BufferedInputStream in = new BufferedInputStream (connection.getInputStream()); 

pbar.setIndeterminate(false); 
pbar.setStringPainted(true); 

java.io.FileOutputStream fos ; 
if(resumebox.isSelected()){ 
    if(fcheck.exists()){ 
     if(connection.getHeaderField("Accept-Ranges").equals("bytes")){ 
      fos = new java.io.FileOutputStream(SaveDir+"/"+filename,true); 
     }else{ 
      fos = new java.io.FileOutputStream(SaveDir+"/"+filename); 
     } 
    }else{ 
     fos = new java.io.FileOutputStream(SaveDir+"/"+filename); 
    } 
}else{ 
    fos = new java.io.FileOutputStream(SaveDir+"/"+filename); 
} 

.... 

मैं एक सर्वर मुझे पता है कि समर्थन करता है फिर से शुरू पर यह परीक्षण कर रहा हूँ।
मैंने कुछ बाइट डाउनलोड किए। (72720)
फिर इसे फिर से शुरू करने का प्रयास किया।
फिर मैंने हेक्स संपादक के साथ फ़ाइल खोली, 72720 ऑफसेट पर पहली बाइट दोहराई गई:
बाइट 0-36: FLV ............. «........ ..onMetaData
बाइट्स 72720-72756: एफएलवी ............. «..........MMetaData
यह शुरुआत से डाउनलोड शुरू करता है!
जब मैं इसे भूलकर करता हूं, यह सामग्री-श्रेणी क्षेत्र द्वारा सही ढंग से और प्रतिक्रिया करता है!
"302 फाउंड" के साथ सर्वर प्रतिक्रियाएं और wget लॉग में "206 आंशिक सामग्री"।
समस्या का कारण बन सकता है "302 फाउंड"?

समस्या क्या है?
धन्यवाद।

+0

दूसरी समस्या यह है कि यदि आपके पास/अन्य ब्लॉक है तो आपके पास अनावश्यक रूप से गहरा घोंसला है। '&&' ऑपरेटर का उपयोग करें। अर्थात। 'अगर (a && b && c) {fos = नया FOS (नाम, सत्य); } else {fos = नया एफओएस (नाम); } '। बस। सूखी। – BalusC

+0

मैंने कोड संक्षेप में किया! उन लोगों में अगर अन्य ब्लॉक मैं कुछ संदेश बढ़ रहा हूं तो यह होना चाहिए। लेकिन आपकी प्रतिक्रिया के लिए धन्यवाद। – RYN

+0

302 समस्या नहीं होनी चाहिए क्योंकि HTTPUrlConnection डिफ़ॉल्ट रूप से रीडायरेक्ट का पालन करता है। जब तक आप स्पष्ट रूप से रीडायरेक्ट बंद नहीं कर रहे हैं, जो मुझे संदेह है क्योंकि आप वास्तव में फ़ाइल सामग्री प्राप्त कर रहे हैं –

उत्तर

17

प्रयास करें:

connection.setRequestProperty("Range", "bytes=" + fcheck.length() + "-"); 

छोटे कल्पना प्रति रेंज विनिर्देशक। साथ ही, यदि आपकी आंशिक फ़ाइल 500 बाइट्स थी, तो इसका मतलब है कि आपके बाइट रेंज में 0-49 9 है, और आप 500+ चाहते हैं।

+0

धन्यवाद। तुम सही हो। लेकिन इसमें एक और समस्या है, मैंने मूल पोस्ट संपादित किया और उस समस्या को जोड़ा। कृपया इसे जांचें। धन्यवाद – RYN

+0

आपको यह सुनिश्चित करने के लिए वायरसहार्क जैसे कुछ का उपयोग करने पर विचार करना चाहिए कि आपका अनुरोध हेडर ठीक से सेट है। आप setRequestProperty के बजाय addRequestProperty का उपयोग करने का प्रयास कर सकते हैं, हालांकि मुझे आशा है कि वे दोनों एक ही काम करेंगे। –

+0

हाय, मैंने वायरशर्क का उपयोग करके कब्जा कर लिया। यह सेट है: "रेंज: बाइट्स = 257177-"! लेकिन यह फिर से बाइट 0 से शुरू होता है! – RYN

3

समस्या (fcheck.length() - 1) में है: यह fcheck.length() होना चाहिए।