Cordova / Ionic - Download file from InAppBrowser

佐手、 提交于 2019-12-01 04:11:57

问题


The scenario goes like this: I open a website in InAppBrowser, after the user ends with the work over there, the site generates a .pdf for the user to download, the problem is that the pdf does not download, it opens it in the browser.

Is there a way to make it download from the InAppBrowser? I'm currently working on an iOS app, so the solution would be better for iOS.

Thanks in advance.


回答1:


Following @jcesarmobile advices this is what I came up with:

First I had to install the cordova-plugin-file-transfer

Open URL

var url = "http://mi-fancy-url.com";
var windowref = window.open(url, '_blank', 'location=no,closebuttoncaption=Cerrar,toolbar=yes,enableViewportScale=yes');

Create a listener on that windowref for a loadstart event and check if what's being loaded is a pdf (that's my case).

windowref.addEventListener('loadstart', function(e) {
  var url = e.url;
  var extension = url.substr(url.length - 4);
  if (extension == '.pdf') {
    var targetPath = cordova.file.documentsDirectory + "receipt.pdf";
    var options = {};
    var args = {
      url: url,
      targetPath: targetPath,
      options: options
    };
    windowref.close(); // close window or you get exception
    document.addEventListener('deviceready', function () {
      setTimeout(function() {
        downloadReceipt(args); // call the function which will download the file 1s after the window is closed, just in case..
      }, 1000);
    });
  }
});

Create the function that will handle the file download and then open it:

function downloadReceipt(args) {
  var fileTransfer = new FileTransfer();
  var uri = encodeURI(args.url);

  fileTransfer.download(
    uri, // file's uri
    args.targetPath, // where will be saved
    function(entry) {
      console.log("download complete: " + entry.toURL());
      window.open(entry.toURL(), '_blank', 'location=no,closebuttoncaption=Cerrar,toolbar=yes,enableViewportScale=yes');
    },
    function(error) {
      console.log("download error source " + error.source);
      console.log("download error target " + error.target);
      console.log("upload error code" + error.code);
    },
    true,
    args.options
  );
}

The problem i'm facing now is the path where it downloads, I just can't open it. But well, at least file is now downloaded. I will have to create a localStorage item to save the paths for different files.

Many validations are missing in this steps, this was just an example I made quickly to check if it works. Further validations are needed.




回答2:


  1. Open you window using IAB plugin and add an event listener ref = window.open(url, "_blank"); ref.addEventListener('loadstop', loadStopCallBack);

  2. In the InAppBrowser window call the action using https://xxx.pdf">documentName

  3. Implement the loadStopCallBack function

    function loadStopCallBack(refTemp) {
        if(refTemp.url.includes('downloadDoc')) {
            rtaParam = getURLParams('downloadDoc', refTemp.url);
    
            if(rtaParam != null)
                downloadFileFromServer(rtaParam);
            return;
        }
    }
    
    function getURLParams( name, url ) {
        try {
            if (!url)
                url = location.href;
            name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]");
            var regexS = "[\\?&]" + name + "=([^&#]*)";
            var regex = new RegExp(regexS);
            var results = regex.exec(url);
            return results == null ? null : results[1];
        } catch (e) {
            showSMS(e);
            return null;
        }
    }
    

After create a download method

function downloadFileFromServer(fileServerURL){
try {
    var Downloader = window.plugins.Downloader;
    var fileName = fileServerURL.substring(fileServerURL.lastIndexOf("/") + 1);

    var downloadSuccessCallback = function(result) {
          console.log(result.path); 

    };

    var downloadErrorCallback = function(error) {
        // error: string
        console.log(error);
    };

    //TODO cordova.file.documentsDirectory for iOS

    var options = {
        title: 'Descarga de '+ fileName, // Download Notification Title
        url: fileServerURL, // File Url
        path: fileName, // The File Name with extension
        description: 'La descarga del archivo esta lista', // Download description Notification String
        visible: true, // This download is visible and shows in the notifications while in progress and after completion.
        folder: "Download" // Folder to save the downloaded file, if not exist it will be created
    };

    Downloader.download(options, downloadSuccessCallback, downloadErrorCallback);
} catch (e) {
    console.log(e);
}

}

you can get the plugin here https://github.com/ogarzonm85/cordova-plugin-downloader

it Works and was too easy



来源:https://stackoverflow.com/questions/33896026/cordova-ionic-download-file-from-inappbrowser

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!