Скачать файлы с Android Webview

Я делаю приложение для Android, которое использует WebView для доступа к веб-странице. Для обработки загрузок я использую AsyncTask в методе onDownloadStart из WebView DownloadListener. Однако загруженные файлы пусты (хотя имя файла и расширение указаны правильно). Мой код Java:

protected String doInBackground(String... url) { try { URL url = new URL(url[0]); //Creating directory if not exists HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setDoOutput(true); connection.connect(); //Obtaining filename File outputFile = new File(directory, filename); InputStream input = new BufferedInputStream(connection.getInputStream()); OutputStream output = new FileOutputStream(outputFile); byte data[] = new byte[1024]; int count = 0; Log.e(null, "input.read(data) = "+input.read(data), null); while ((count = input.read(data)) != -1) { output.write(data, 0, count); } connection.disconnect(); output.flush(); output.close(); input.close(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null;
}

Строка log.e дает значение -1 для input.read(data). PHP-код страницы загрузки - это (работает на всех платформах). Файлы хранятся в непубличных каталогах моего HTML-сервера.

Я заметил, что если я напишу текст после "?>" Файла PHP, этот текст будет записан в загруженный файл.

1 ответ

В вашем коде вы используете ob_clean(), который просто ob_clean() выходной буфер. Поэтому ваш последующий вызов flush() не возвращает ничего, потому что выходной буфер был предварительно очищен.

Вместо ob_clean() и flush() используйте ob_end_flush(). Это остановит буферизацию вывода и отправит весь вывод, который он оставил.

ob_end_flush - очистить (отправить) буфер вывода и отключить буферизацию вывода

Если вы хотите остановить буферизацию вывода, не выгружая все, что было сохранено, вы можете использовать ob_end_clean(). Все, что после этой команды будет выводиться снова, но ничего между ob_start() и ob_end_clean() будет "проглочено".

ob_end_clean - очистить (стереть) буфер вывода и отключить буферизацию вывода

Каковы преимущества буферизации вывода в первую очередь? Если вы делаете ob_start() а затем используете flush() во всем, что вы могли бы вывести все напрямую.

licensed under cc by-sa 3.0 with attribution.