使用Android Webview下载文件

时间:2014-07-22 08:34:47

标签: java php android webview

我正在制作一个使用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文件,这个文本写在下载的文件中。

1 个答案:

答案 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(),那么您可以直接输出所有内容。