fileOpener2有什么问题?

时间:2016-07-26 22:23:49

标签: javascript cordova plugins

这个问题是编辑更好的欠载: 我正在尝试使用cordova fileOpener2插件在我的应用程序资产中打开pdf文件。 感谢第14行以及下面的代码,我获得了文件的uri。 然后将uri存储为varialbe(nonencodeduri)。 但是,当我尝试在代码的第二部分中使用变量时,FileOpener2需要文件的路径(来自第58行),它会停止。 这是令人惊讶的,因为如果我写硬编码到同一文件行58的路径(var uri = var uri = encodeURI("应用程序资产中的文件路径"),它就可以工作。 谢谢你帮我解决了这个问题。

这是完整的代码(图片来源:Ghandi)

d

我用过:

var  entry, documentname, documentid, referenceID, callLogID, filePath, blob,cdr,fileObject;
var filename = "test.pdf";


$(document).ready(function() {
    document.addEventListener("deviceready", onDeviceReady, false);
});

var fileURL = "";
var imagePath = "";
function onDeviceReady() {  
    sessionStorage.platform = device.platform;
    var fileTransfer = new FileTransfer();
     $('a[href$=\\.pdf]').click(function()
        {   
            try {
                alert('Hi boys');   
                var urinonencoded = this.href;
                alert(urinonencoded + ' and voila');                                        
                if (sessionStorage.platform.toLowerCase() == "android") {
                    window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory,onFileSystemSuccess, onError);
                }
                else {
                    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0,onFileSystemSuccess, onError);
                }

            }
            catch(err) {
                alert("ER - " + err.message);
            }

        }); 

        function onError(e) {
            alert("onError");
        };

        function onFileSystemSuccess(fileSystem) {
            var entry="";
            if (sessionStorage.platform.toLowerCase() == "android") {
                entry=fileSystem;
            }
            else {
                entry=fileSystem.root;
            }           
            entry.getDirectory("Cordova", {create: true, exclusive: false}, onGetDirectorySuccess, onGetDirectoryFail);
        };
        function onGetDirectorySuccess(dir) {
            dir.getDirectory("Sample_App", {create: true, exclusive: false}, onGetDirectorySuccess1, onGetDirectoryFail);
        };
        function onGetDirectorySuccess1(dir) {
            cdr = dir;
            dir.getFile(filename,{create:true, exclusive:false},gotFileEntry, errorHandler);
        };
        function gotFileEntry(fileEntry) {                                      
                /*var uri = encodeURI(myref);*/

                    var uri = urinonencoded;
                    alert (uri);


                alert("dest - " + cdr.nativeURL+filename);
                fileTransfer.download(uri,cdr.nativeURL+filename,
                    function(entry) {                       
                        openFile();
                    },
                    function(error) {
                        alert("download error source " + error.source);
                        alert("download error target " + error.target);
                        alert("upload error code" + error.code);
                        alert("error");
                    },
                    true);              
        };

        function openFile() {
            alert("URL - " + cdr.nativeURL+filename);
            cordova.plugins.fileOpener2.open(
                cdr.nativeURL+filename, 
                'application/pdf', 
                //'text/plain',
                { 
                    error : function(e) { 
                        alert('Error status: ' + e.status + ' - Error message: ' + e.message);
                    },
                    success : function () {                                    
                    }
                }
            );
        };
        function onFileSystemSuccessDelete(fileSystem) {
            var entry="";
            if (sessionStorage.platform.toLowerCase() == "android") {
                entry=fileSystem;
            }
            else {
                entry=fileSystem.root;
            }   
            entry.getDirectory("Cordova/Sample_App", {create: true, exclusive: false}, onGetDirectorySuccessDelete, onGetDirectoryFail);

        };
        function onGetDirectorySuccessDelete(dir) {
            dir.getFile(filename,{create: true, exclusive:false},gotFileEntryDelete, fail);                     
        };

        function gotFileEntryDelete(fileEntry) {
            fileEntry.remove();
            var uri = encodeURI("http://SERVER_IP:PORT/test.pdf");
                fileTransfer.download(uri,cdr.nativeURL+filename,
                    function(entry) {
                        console.log("download complete: " + entry.toURL());                     
                        openFile();
                    },
                    function(error) {
                        alert("download error source " + error.source);
                        alert("download error target " + error.target);
                        alert("upload error code" + error.code);
                        alert("error");
                    },
                    true);              
        };      

        function fail(error){
            alert("ec - " + error.code);
        };

        function  errorHandler(e) {
            var msg = '';
            switch (e.code) {
                case FileError.QUOTA_EXCEEDED_ERR:
                    msg = 'QUOTA_EXCEEDED_ERR';
                    break;
                case FileError.NOT_FOUND_ERR:
                    msg = 'NOT_FOUND_ERR';
                    break;
                case FileError.SECURITY_ERR:
                    msg = 'SECURITY_ERR';
                    break;
                case FileError.INVALID_MODIFICATION_ERR:
                    msg = 'INVALID_MODIFICATION_ERR';
                    break;
                case FileError.INVALID_STATE_ERR:
                    msg = 'INVALID_STATE_ERR';
                    break;
                default:
                    msg = e.code;
                    break;
            };
            alert("Msg - " + msg);
        };

        function onGetDirectoryFail(error) {
            alert("onGetDirectoryFail");
        };

        $('#delete').click(ClearDirectory);

        function ClearDirectory() {
            alert("delete");
            if (sessionStorage.platform.toLowerCase() == "android") {
                window.resolveLocalFileSystemURL(cordova.file.externalRootDirectory,onFileSystemDirSuccess, fail);
            }
            else {
                window.requestFileSystem(LocalFileSystem.PERSISTENT, 0,onFileSystemDirSuccess, fail);
            }        
        }
        function onFileSystemDirSuccess(fileSystem) {
            var entry = "";
            if (sessionStorage.platform.toLowerCase() == "android") {
                entry=fileSystem;
            }
            else {
                entry=fileSystem.root;
            }   
            entry.getDirectory("Cordova",{create : true, exclusive : false},
                function(entry) {
                    entry.removeRecursively(function() {
                        console.log("Remove Recursively Succeeded");
                    }, fail);
                }, getDirFail);
        }

        function getDirFail(error){
            alert("getDirFail - " + error.code);
        };

}

它挂起(我在config.xml文件中声明了插件并出现在资产中。

你能找出我的错误吗?

非常感谢

3 个答案:

答案 0 :(得分:1)

'this.href'错了,请这样试试:

$('a[href$=\\.pdf]').click(function () {
    var myuri = this.href;
    alert(this.href);

    /*alert just to make sure I got the right uri (which works fine)*/

    cordova.plugins.fileOpener2.open(
        myuri, // You can also use a Cordova-style file uri: cdvfile://localhost/persistent/Download/starwars.pdf
        'application/pdf',
        {
            error: function (e) {
                alert('Error status: ' + e.status + ' - Error message: ' + e.message);
            },
            success: function () {
                alert('file opened successfully');
            }
        }
    );
    return false;
});

答案 1 :(得分:1)

基本上问题在于你传递给{fileerner'开放函数的file path参数的方式,并且这个插件没有任何问题。

如果您在this之类的单引号中传递'this.href'对象,则会将其视为纯字符串,这就是问题所在。所以你可以像Joerg在答案中建议的那样使用这种方法。

请查看演示Cordova文件操作的basic working sample app。它应该可以帮助你开始。

答案 2 :(得分:1)

总结这个复杂问题的答案: 第一个:fileopener2不能单独工作,它需要其他插件才能适应在android上打开pdf文件的目的。 Gandhi提供的优秀演示应用程序here中提到了所需的其他插件。 第二:使用Gandhi的app.js文件结合不同的插件调用是esssentiel。 第三该文件中涉及许多功能。在其中路径是硬编码的,所以一切似乎都很好。但是如果必须使用动态路径,则必须全局声明(换句话说,不要使用“var”,而只需使用myvar = this.href。

虽然我自己找到了最后一点,但所有功劳都归功于Gandhi的优秀演示应用程序,这是他在github上提供的新插件用户的宝库。 +1: - )