Phonegap/Cordova InAppbrowser 文件下载问题

Posted

技术标签:

【中文标题】Phonegap/Cordova InAppbrowser 文件下载问题【英文标题】:Phonegap/Cordova InAppbrowser File Download issue 【发布时间】:2014-12-26 03:30:54 【问题描述】:

我正在使用 PhoneGap/Cordova 开发移动应用程序。 我使用 InAppBrowser 在 Cordova 中使用“window.open”方法显示外部网站。

外部网站显示一些文件列表和下载链接。当我单击下载超链接时,它在所有浏览器中都可以正常工作。

但是当我在 Cordova Mobile 应用程序中从 InAppBrowser 调用该外部网站时,该页面中的下载链接不起作用。

我们在使用 InAppBrowsers 时无法使用 Cordova API。我该如何克服这个问题?

更新:

我在 ASP.Net 中开发了一个响应式网站。该网站的功能之一是将文件以字节的形式保存到 SQL 服务器,并在需要时以文件的形式下载。

我有一个 GridView 控件来显示要下载的文件和选项列表。 当您单击文件下载时,服务器端代码将从 SQL Server 创建文件并附加 HTTP 响应。

C#代码:

        Response.Clear();
        Response.Buffer = true;
        Response.Charset = "";
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.ContentType = contentType;
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
        Response.BinaryWrite(bytes);
        Response.Flush();
        Response.End();

当您在桌面浏览器中运行此 Web 应用程序时,它将按预期运行。文件将被下载。

我已将此网站封装在 Phonegap/Cordova Mobile 应用程序中。

javascript

window.open(encodeURI("http://example.com/Files.aspx"), '_blank', 'location=no');

网站将在 InAppBrowser 上运行。它无法处理下载文件的 http 响应。

我们可以通过修改 android/ios 原生代码来解决这个问题。 我无法访问 android/IOS 代码。因为我使用 IntelXDK 在云端构建 android/IOS 应用程序。

以下提供了总体问题。 在 Cordova InAppBrowser 中,如何处理包含文件内容类型的 Http 响应?

【问题讨论】:

我已经更新了问题的详细解释。任何帮助将不胜感激。谢谢。 我现在面临问题,您找到解决方案了吗?你能帮帮我吗 【参考方案1】:

InAppBrowser 不允许下载。您需要修改插件以允许下载。

对于安卓,在platforms\android\src\org\apache\cordova\inappbrowser

方法名private void navigate(String url)

包括

this.inAppWebView.setDownloadListener(new DownloadListener() 
                    public void onDownloadStart(String url, String userAgent,
                            String contentDisposition, String mimetype,
                            long contentLength) 
                      Intent i = new Intent(Intent.ACTION_VIEW);
                      i.setData(Uri.parse(url));
                      cordova.getActivity().startActivity(i);
                    
                );

在这行之前this.inAppWebView.requestFocus();

同样的代码在方法public void run()

在这一段之后

if (clearAllCache) 
                CookieManager.getInstance().removeAllCookie();
             else if (clearSessionCache) 
                CookieManager.getInstance().removeSessionCookie();
            

            inAppWebView.loadUrl(url);

在 onCreate 内的 .java 文件中

appView.setDownloadListener(new DownloadListener() 
                    public void onDownloadStart(String url, String userAgent,
                            String contentDisposition, String mimetype,
                            long contentLength) 
                      Intent i = new Intent(Intent.ACTION_VIEW);
                      i.setData(Uri.parse(url));
                      startActivity(i);
                    
                );

不了解 iOS

【讨论】:

谢谢。但是我使用Intel XDK在云端构建PhoneGap App。这样,无法修改/自定义android/IOS的原生代码。有没有其他方法可以解决这个问题? 这个答案在当前版本的 plugin/cordova 中也已经过时了

以上是关于Phonegap/Cordova InAppbrowser 文件下载问题的主要内容,如果未能解决你的问题,请参考以下文章

Phonegap/Cordova 中的本地通知

基于 Swift 项目的 PhoneGap/Cordova App

PhoneGap/Cordova 设备未准备好

桌面/移动标准网页中的phonegap / cordova社交共享插件

没有phonegap\.cordova\config.json

CompileXIB 中的 Phonegap (Cordova) 错误