WebView - 不请求两次如何下载文件?

9
如果我使用DownloadListener来监听,我会得到URL,但需要在浏览器已经请求它之后再请求。浏览器已经打开了到该URL的连接(这就是它知道这是一个下载的原因),为什么它不能把连接传递给我呢?
我还尝试将自定义WebViewClient分配给WebView,并使用shouldOverrideUrlLoading在请求之前捕获URL。要以这种方式下载文件,我会在浏览器之前请求每个URL,并根据其Content-Type决定是否下载它。如果是,则从已打开的连接中下载它;否则,我会关闭连接并指示浏览器加载它,而浏览器会再次请求它。此外,在shouldOverrideUrlLoading中,我没有被告知应该使用哪种方法和什么cookie来请求给定的URL。
我该如何避免不必要的双重请求,同时仍然能够使用WebView下载文件?

你有没有找到正确的答案?这个问题已经重新出现了 https://dev59.com/MWjWa4cB1Zd3GeqPtblp - Michael Levy
你好。你是怎么解决的?我的意思是如何防止向服务器发送重复请求?我知道需要防止的URL。 - runia
3个回答

1
为什么不直接使用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;
}

谢谢,但我不使用OutputStream,因为它无法从Rapidshare和许多类似的服务器下载文件。 - Eli Revah

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

0

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

所以您确定吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接