WebView - 如果不请求两次就无法下载文件?

Posted

技术标签:

【中文标题】WebView - 如果不请求两次就无法下载文件?【英文标题】:WebView - can't download file without requesting it twice? 【发布时间】:2012-08-01 20:38:42 【问题描述】:

如果我用DownloadListener 收听,我会在浏览器已经请求它之后获得我需要请求的 URL。浏览器已经打开了与 URL 的连接(它是如何知道这是下载),为什么它不能将连接传递给我?

我还尝试将自定义 WebViewClient 分配给 WebView 并使用 shouldOverrideUrlLoading 在请求 URL 之前捕获它们。要以这种方式下载文件,我在浏览器之前请求每个 URL,并通过它的 Content-Type 我决定是否下载它,如果是,那么我从已经打开的连接下载它,否则我关闭连接并指示浏览器加载它,并且浏览器......再次请求它。另外,在shouldOverrideUrlLoading 中,我没有被告知应该使用哪种方法和哪些 cookie 来请求给定的 URL。

我怎样才能不必要地请求两次并且仍然能够使用 WebView 下载文件?

【问题讨论】:

你找到正确答案了吗?问题已返回***.com/q/12535414/90236 你好。你怎么修好它的?我的意思是防止对服务器的双重请求?我知道我需要阻止的 url。 【参考方案1】:

一个简单的解决方案是将其修改为仅下载它而不要求用户根据内容类型进行确认,而是只需在用于监视下载的任何内容上放置一个取消按钮。

【讨论】:

【参考方案2】:

为什么不直接使用 url 来使用 outputstream 下载呢?这是一个例子:

private class DownloadFile extends AsyncTask<String, Integer, String> 
@Override
protected String doInBackground(String... sUrl) 
    try 
        URL url = new URL(sUrl[0]);
        URLConnection connection = url.openConnection();
        connection.connect();

        // download the file
        InputStream input = new BufferedInputStream(url.openStream());
        OutputStream output = new FileOutputStream("/sdcard/file_name.extension");

        byte data[] = new byte[1024];
        long total = 0;
        int count;
        while ((count = input.read(data)) != -1) 
            total += count;
            output.write(data, 0, count);
        

        output.flush();
        output.close();
        input.close();
     catch (Exception e) 
    
    return null;

【讨论】:

Thanx,但我不使用 OutputStream,因为它无法从 Rapidshare 和许多类似的服务器下载文件。【参考方案3】:

您确定要中断浏览器工作吗?它使用多线程下载多个 URL,并且他正在管理自己的文件系统来为这些 url 创建 cookie,并且他知道何时需要删除它们并更新它们。

所以你确定?

【讨论】:

以上是关于WebView - 如果不请求两次就无法下载文件?的主要内容,如果未能解决你的问题,请参考以下文章

iCloud Drive中的elcel文件不注意保存了两次就变成了这个东西,文件也找不到了,怎么办?

td中自动换行,设置两次就就无法实现

如何在不允许请求页面两次的情况下支持 IDM

我无法请求文件系统,在我通过浏览器打开 ***.doc 后,无论 childBroswer 或默认 webview

Flutter - 无法从 Webview 下载文件

无法使用下载管理器在 android webview 中下载 excel