Android浏览器/ webview错误?内容 - 处理:附件;文件名= “xyz.txt将该”

时间:2010-10-22 00:10:57

标签: android webview download content-disposition

所以Android浏览器或webview可以正常使用这样的网址 - abc.com/xyz.txt

但是,如果您的网址如下所示 - abc.com/xyz.php以及标题中发送到浏览器的内容是 - 内容处置:附件; filename =“xyz.txt”,然后Android浏览器和网页视图似乎非常混乱。

看起来它在手机上保存了正确的文件名,但内容中填充了之前正在查看的网页。这在基于PC的浏览器以及iPhone和Blackberry上非常有效,它只是Android 2.1和2.2上的一个问题(尚未测试其他人)。

有人有解决方案吗?将非常感激。我真的不想开始存储静态文件,并希望动态生成我的下载内容。电话上的日志显示没有线索。


这是服务器发送到浏览器的内容

===================== start content ====================================
HTTP/1.1 200 OK
Date: Thu, 21 Oct 2010 21:22:11 GMT
Server: Apache
Content-Disposition: attachment; filename="Wafty.txt"
Content-length: 30
Content-Type: text/plain; charset=ISO-8859-1

Hello this is a test of a file
========= There was no carriage return at the end of the above line ====

2 个答案:

答案 0 :(得分:1)

使用

Content-Disposition: attachment;filename="xyz.txt"

不要使用

Content-Disposition: attachment;  filename="xyz.txt"

答案 1 :(得分:1)

我遇到了类似的问题。这里的问题是WebView如何处理附件(这是一个真正的痛苦)。当WebView访问某个网页时,它会在某个时刻返回一个附件,它有点像“哦废话,我该怎么办这个非HTML的东西?... Ey you!DownloadListener!用这个URL做一些说法关于附件的一些废话“。因此,DownloadListener接管并且问题在于:它再次请求相同的URL来下载附件,因此,为了在访问页面时下载附件,WebView执行2个请求:页面本身,然后另一个下载附件,而不仅仅是下载它。

这是怎么回事?好吧,让我们说你的abc.com/xyz.php有一些逻辑:

<?php
   if(User::loggedIn()) {
       header("Content-Disposition: attachment...");
       //Some more logic for the download
   }
?>

DownloadListener执行的第二个请求将向abc.com/xyz.php发出另一个请求,但这次它不包含cookie或会话信息,因此不会进入“下载”逻辑。

一种可能的解决方案是重定向到临时副本或文件的真实路径,该路径不包含任何逻辑,因此没有问题。当然,您还需要使用WebView定义下载侦听器,例如。

webView.setDownloadListener(new DownloadListener() {

    @Override
    public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimeType, long contentLength) {

        final DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        Request request = new DownloadManager.Request(Uri.parse(url));
        request.setMimeType(mimeType);

        //Persist download notification in the status bar after the download completes (Android 3.0+)
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            request.allowScanningByMediaScanner();
            request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
        }

        dm.enqueue(request);
    }

});