मेरा कोड (नीचे पुन: उत्पादित), एक यूआरएल से कनेक्ट होता है और फ़ाइल को एंड्रॉइड पर डिस्क पर डाउनलोड करता है। सभी मानक सामान। जब मैं अपने कोड पर एक सबडोमेन के माध्यम से एक्सेस किए गए एस 3 पर एक फ़ाइल पर इस कोड का उपयोग करने की कोशिश करता हूं (उदाहरण के लिए foo.example.com => बाल्टी foo.example.com कहा जाता है), यह अक्सर विफल रहता है। पता चला है (काम कर्ल आदेश का उपयोग ..एंड्रॉइड/जावा: HttpURLConnection पुनर्निर्देशित फ़ाइल के शीर्षलेख (जैसे S3 पर) वापस नहीं करता है
"curl -v -L -X GET http://foo.example.com/f/a.txt")
.. वहाँ एक रीडायरेक्ट यहां चल रहा है।
फ़ाइल डाउनलोड ठीक काम करता है, के रूप में HttpURLConnection डिफ़ॉल्ट रूप से रीडायरेक्ट का पालन करेंगे, लेकिन कॉल कि आवश्यकता है कि शीर्ष लेख जानकारी (getContentLength, getHeaderFieldDate ("Last-Modified", 0) आदि) रिटर्न 307 रीडायरेक्ट से हेडर हैं, और नहीं वास्तविक फ़ाइल thats डाउनलोड किया।
किसी को भी पता है कि यह चारों ओर पाने के लिए?
धन्यवाद
File local = null;
try {
Log.i(TAG, "Downloading file " + source);
conn = (HttpURLConnection) new URL(source).openConnection();
fileSize = conn.getContentLength(); // ** THIS IS WRONG ON REDIRECTED FILES
out = new BufferedOutputStream(new FileOutputStream(destination, false), 8 * 1024);
conn.connect();
stream = new BufferedInputStream(conn.getInputStream(), 8 * 1024);
byte[] buffer = new byte[MAX_BUFFER_SIZE];
while (true) {
int read = stream.read(buffer);
if (read == -1) {
break;
}
// writing to buffer
out.write(buffer, 0, read);
downloaded += read;
publishProgress(downloaded, fileSize);
if (isCancelled()) {
return "The user cancelled the download";
}
}
} catch (Exception e) {
String msg = "Failed to download file " + source + ". " + e.getMessage();
Log.e(TAG, msg);
return msg;
} finally {
if (out != null) {
try {
out.flush();
out.close();
} catch (IOException e) {
Log.e(TAG, "Failed to close file " + destination);
e.printStackTrace();
}
}
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
Log.e(TAG, "Failed to close file " + destination);
e.printStackTrace();
}
} else {
long dateLong = conn.getHeaderFieldDate("Last-Modified", 0); // ** THIS IS WRONG ON REDIRECTED FILES
Date d = new Date(dateLong);
local.setLastModified(dateLong);
}
धन्यवाद। मुझे लगता है कि यह एकाधिक रीडायरेक्ट के साथ थोड़ा सा झुकाव प्राप्त करेगा लेकिन यह –
की मदद कर सकता है मैं विभिन्न एंड्रॉइड घटकों के लिए रीडायरेक्टिंग कोड में अन्य अजीब गेटचास में चला गया हूं। यहां तक कि एक ही ओएस संस्करण पर, विभिन्न डिवाइस उन्हें अलग-अलग संभालेंगे। परिणामस्वरूप हम मैन्युअल रीडायरेक्ट पर स्विच कर चुके हैं। –
आह, दिलचस्प। मैं HttpURLConnection के बजाय apache HttpClient का उपयोग करने के साथ प्रयोग कर रहा हूं, और यह मेरे लिए काम कर रहा है (अब तक!)। आपके एंड्रॉइड घटकों के साथ क्या समस्याएं हैं? –