Я пытаюсь загрузить большой файл со своего сервера веб-сайта Yahoo!, который, по-видимому, является установкой (не мной) для разъединения загрузок, если они не завершаются в течение 100 секунд. Файл является достаточно маленьким к обычно успешно передаче. В случаях, когда скорость передачи данных является медленной и разъединяется загрузка, там способ возобновить URLConnection при файловом смещении, где разъединение произошло? Вот код:
// Setup connection.
URL url = new URL(strUrl[0]);
URLConnection cx = url.openConnection();
cx.connect();
// Setup streams and buffers.
int lengthFile = cx.getContentLength();
InputStream input = new BufferedInputStream(url.openStream());
OutputStream output = new FileOutputStream(strUrl[1]);
byte data[] = new byte[1024];
// Download file.
for (total=0; (count=input.read(data, 0, 1024)) != -1; total+=count) {
publishProgress((int)(total*100/lengthFile));
output.write(data, 0, count);
Log.d("AsyncDownloadFile", "bytes: " + total);
}
// Close streams.
output.flush();
output.close();
input.close();
Попробуйте использовать заголовок запроса «Диапазон»:
// Open connection to URL.
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// Specify what portion of file to download.
connection.setRequestProperty("Range", "bytes=" + downloaded + "-");
// here "downloaded" is the data length already previously downloaded.
// Connect to server.
connection.connect();
Сделав это, вы можете искать
в заданной точке (непосредственно перед длиной ваших загружаемых данных, скажем X
) и начните записывать туда вновь загруженные данные. Обязательно используйте то же значение X
для заголовка диапазона.
Подробная информация о 14.35.2 Запросы на получение диапазона
Более подробную информацию и исходный код можно найти здесь