我正在制作一个使用WebView访问网页的Android应用。为了处理下载,我在WebView的DownloadListener的onDownloadStart方法中使用了AsyncTask。但是,下载的文件是空白的(尽管文件名和扩展名是正确的)。我的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行为input.read(data)提供-1值。 下载页面的PHP代码是这样的(适用于所有平台)。文件存储在我的HTML服务器的非公共目录中。
<?php
$guid = $_GET['id'];
$file = get_file($guid);
if (isset($file['path'])) {
$mime = $file['MIMEType'];
if (!$mime) {
$mime = "application/octet-stream";
}
header("Pragma: public");
header("Content-type: $mime");
header("Content-Disposition: attachment; filename=\"{$file['filename']}\"");
header('Content-Transfer-Encoding: binary');
ob_clean();
flush();
readfile($file['path']);
exit();
}
?>
我注意到如果我在&#34;?&gt;&#34;之后写了一些文字。 PHP文件,这个文本写在下载的文件中。
答案 0 :(得分:0)
在您的代码中,您使用的是ob_clean()
,它只会删除输出缓冲区。因此,您对flush()
的后续调用不会返回任何内容,因为事先已刷新输出缓冲区。
使用ob_end_flush()
而不是ob_clean()
和flush()
。这将停止输出缓冲,它将发送它保留的所有输出。
ob_end_flush - 刷新(发送)输出缓冲区并关闭输出缓冲
如果要停止输出缓冲而不输出保存的内容,可以使用ob_end_clean()
。此命令之后的任何内容都将再次输出,但ob_start()
和ob_end_clean()
之间的任何内容都将被吞下。&#34;
ob_end_clean - 清除(擦除)输出缓冲区并关闭输出缓冲
首先输出缓冲有什么好处?如果您正在执行ob_start()
,然后在所有内容上使用flush()
,那么您可以直接输出所有内容。