Скачать файлы с 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.