webview的onDownloadStart参数没有设置?如何检索文件名?

4
我有一段 JavaScript 代码,在其中使用锚点标签的下载属性来设置文件名。以下是我的代码片段:
const fileReader = new FileReader();
fileReader.onload = () => {
const link = <HTMLAnchorElement>windowService.document.createElement("a");
link.href = fileReader.result;
link.setAttribute("download", fileName);
link.target = "_blank";

windowService.document.body.appendChild(link);
link.click();
};
fileReader.readAsDataURL(testFile);
}

其中testFile是数据的二进制大对象(blob)。这段代码在所有浏览器和iOS应用程序中都可以正常运行,但在Android应用程序中无法正常工作。在Android WebView上,onDownloadListener函数被调用,只设置了URL参数,没有设置其他参数。

    webView.setDownloadListener(new DownloadListener() {
                @Override
                public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
// url: set as base64 encoded content
// no other attribute is set. I understand content disposition can be used to get file name but that is not set either
}
}

我希望能够获取下载属性上分配给文件的文件名。如何检索相同的文件名? 我正在使用Android API 28进行测试。

2个回答

0

我使用URLUtil非常顺利和容易

webView.setDownloadListener(new DownloadListener() {
        @Override
        public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
            String filename = URLUtil.guessFileName(url, contentDisposition, mimetype);
            Toast.makeText(MainActivity.this, filename, Toast.LENGTH_SHORT).show();
        }
    });

2
这对我不起作用,因为contentDisposition和mimeType中没有数据。 - CuriousBug

0

我遇到了同样的问题,我知道Chrome有能力做到这一点。 Chrome有单元测试来测试这个https://source.chromium.org/chromium/chromium/src/+/main:content/browser/download/download_browsertest.cc;drc=0b067632d4fd6e470cca27ceb2795e194337b30a;l=4239

在Android上,Chrome在下载过程中使用这个值,我们可以看到 https://source.chromium.org/search?q=GetTargetFilePath&sq=&ss=chromium%2Fchromium%2Fsrc:chrome%2Fbrowser%2Fdownload%2Fandroid%2F

我们可以看到,例如它使用这个值来打开已完成的下载 https://source.chromium.org/chromium/chromium/src/+/main:chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUtils.java;drc=f03f9c715ccd0bb898c58a06ab5f7f3ba435164c;l=482

我们还可以看到它在哪里创建了下载信息。https://source.chromium.org/chromium/chromium/src/+/main:chrome/browser/download/android/download_manager_service.cc;drc=0e2c54333690dadb1456f0fbe30356df0b90d745;l=166

我已经进行了大量的搜索,但是没有成功解决这个问题,但这是我能找到的最好的线索来解决它。如果我发现我们可以在Webview中触发它,我会更新的,但迄今为止我还没有找到任何人成功获取对象URL名称。

从这次搜索中,我得出结论谷歌实际上并没有在Chromium中使用onDownloadStart,而是在C++中处理它,其中GetTargetFilePath存在以提供额外信息。onDownloadStart是在创建AOSP(Android开源项目)浏览器时存在的,而Chrome是一个不同的平台,只是向该方法公开信息,但不消耗它。因此,onDownloadStart不包含建议的文件名可能是一个疏忽。

来源(Chrome不使用此方法):https://source.chromium.org/search?q=%20onDownloadStart%20language:java&ss=chromium%2Fchromium%2Fsrc&start=21


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