phonegap iOS file.path

时间:2014-05-22 08:17:55

标签: android ios cordova

我有一个使用cordova 3.4和文件1.1.0的应用程序。 如果我使用相机模块复制图像,我使用

myFileObj.path = file.toNativeURL()

获取文件路径。如果我将此路径放入img-tag,我会在Android上显示该图片。 在iOS上它不起作用。 file.toNativeURL()的结果:

myFileObj.path -> file:///Users/.../Library/Application%20Support/..../myFolder/myImage.JPG

使用文件1.0我必须构建网址,它看起来像这样:

myFileObj.path = dirTarget.toURL() + '/' + targetFileName 
myFileObj.path -> cdvfile://localhost/persisten/myFolder/myImage.JPG

视频和音频不起作用,但至少是图片。

使用文件1.1.0 / 1.1.1,此方法的结果也不同:

myFileObj.path -> file:///Users/mak/Library/.../myFolder/myImage.JPG?id=.....&ext=JPG

这在iOS上也不起作用。

如何使用cordova文件模块版本1.1.0和1.1.1获取有效的文件路径?

编辑:我在做什么,什么不行:

我从媒体库中复制图像并将其放入我自己创建的文件夹中。 什么在Android中有效,在iOS中不起作用: 在Android中,media-tags的src属性能够显示资源,iOS无法在src-path中找到资源。

从媒体库中捕获文件:

navigator.camera.getPicture(onSuccess, onFail, {
      destinationType: Camera.DestinationType.NATIVE_URI,
      sourceType : Camera.PictureSourceType.PHOTOLIBRARY,
      mediaType: Camera.MediaType.ALLMEDIA
  });

成功回调:

function onSuccess(imageData) {
    A.StoreFile(imageData, id);
}

创建文件夹并存储文件:

A.StoreFile = function(file, idBox) {

    var targetDirectory = Config.getRootPath();
    window.resolveLocalFileSystemURL(file, resolveFileSystemSuccess, resolveFileSystemError);


    function resolveFileSystemSuccess(fileEntry) {
    fileEntry.file(function(filee) {
        mimeType = filee.type;
        getFileSuccess(fileEntry, mimeType);
    }, function() {
    });
}


function getFileSuccess(fileEntry, mimeType) {

    var targetFileName = name + '.' + fileNativeType;

    var parentName = targetDirectory.substring(targetDirectory.lastIndexOf('/')+1),
    parentEntry = new DirectoryEntry(parentName, targetDirectory);


    window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) {
        fileSystem.root.getDirectory(targetDirectory, {create: true, exclusive: false}, function(dirTarget) {
            fileEntry.copyTo(dirTarget, targetFileName, function(entry) {
                addFileToLocalStorage(entry);
            }, function() {
            })
        })
    }, resolveFileSystemError);

}

将文件信息存储到localStorageObject

function addFileToLocalStorage(file) {
    fileList.addFile(
        {
            name:file.name,
            internalURL: file.toNativeURL()
        });
}

动态地将文件添加到dom:

myElement.find('.myMimeTypeTag').attr('src', fileList[f].internalURL);

这适用于Android,而不适用于iOS。

iOS-img-container的结果:

enter image description here

错误消息:

DEPRECATED: Update your code to use 'toURL'

toURL无效

id="org.apache.cordova.file"
version="1.1.1-dev"

2 个答案:

答案 0 :(得分:1)

我刚刚测试了这个,稍微简化了你的代码版本(你的代码似乎有很多额外的结构没有显示,但是如果我的代码之间存在显着差异在这里和你的应用程序做什么,然后让我知道。问题将出现差异。)

我使用File 1.1.0和Camera 0.2.9刚刚发布Cordova 3.5.0。

要创建应用,我使用了cordova命令行工具,然后运行

cordova create so23801369 com.example.so23801369 so23801369
cd so23801369
cordova platform add ios
cordova plugin add org.apache.cordova.file
cordova plugin add org.apache.cordova.camera

这会创建一个默认的“Hello,Cordova”应用程序,我已经添加了一些代码(我相信)会复制代码的代码。

我在index.html中添加了两行:

<button id="doit">Do it</button>
<img class="myMimeTypeTag" src="file:///nothing" />

我编辑www/js/index.js看起来像这样:

var app = {

    initialize: function() {
        // Don't activate the button until Cordova is initialized
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },

    onDeviceReady: function() {
        document.getElementById('doit').addEventListener('click', app.runTest, false);
    },

    runTest: function(ev) {
        var StoreFile = function(file) {
            var targetDirectory = "myFolder";
            window.resolveLocalFileSystemURL(file, resolveFileSystemSuccess, resolveFileSystemError);

            function resolveFileSystemSuccess(fileEntry) {
                console.log("resolveLocalFileSystemURL returned: ", fileEntry.toURL());
                fileEntry.file(function(filee) {
                    mimeType = filee.type;
                    getFileSuccess(fileEntry, mimeType);
                }, function() {
                });
            }
            function resolveFileSystemError() {
                console.log("resolveFileSystemError: FAIL");
                console.log(arguments);
                alert("FAIL");
            }

            function getFileSuccess(fileEntry, mimeType) {
                var targetFileName = "myImage.JPG";
                window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fileSystem) {
                    fileSystem.root.getDirectory(targetDirectory, {create: true, exclusive: false}, function(dirTarget) {
                        fileEntry.copyTo(dirTarget, targetFileName, function(entry) {
                            console.log("copyTo returned: ", entry.toURL());
                            // I have replaced the localstorage handling with this code
                            // addFileToLocalStorage(entry);
                            var img = document.querySelector('.myMimeTypeTag');
                            img.setAttribute('src', entry.toNativeURL());
                        }, function() {
                        });
                    });
                }, resolveFileSystemError);
            }
        };

        var onSuccess = function(imageData) {
            console.log("getPicture returned: ", imageData);
            StoreFile(imageData);
        };

        var onFail = function() {
            console.log("getPicture FAIL");
            console.log(arguments);
            alert("FAIL");
        };

        ev.preventDefault();
        ev.stopPropagation();
        navigator.camera.getPicture(onSuccess, onFail, {
            destinationType: Camera.DestinationType.NATIVE_URI,
            sourceType : Camera.PictureSourceType.PHOTOLIBRARY,
            mediaType: Camera.MediaType.ALLMEDIA
        });
    }
};

当我运行它时,我可以从媒体库中选择一个图像,并在页面中成功显示它,图像src设置为复制的图像文件的URL。如果我将Safari开发工具连接到iPad,我会看到此控制台输出:

[Log] getPicture returned:  assets-library://asset/asset.JPG?id=F9B8C942-367E-433A-9A71-40C5F2806A74&ext=JPG (index.js, line 49)
[Log] resolveLocalFileSystemURL returned:  cdvfile://localhost/assets-library/asset/asset.JPG?id=F9B8C942-367E-433A-9A71-40C5F2806A74&ext=JPG (index.js, line 18)
[Log] copyTo returned:  file:///var/mobile/Applications/9C838867-30BE-4703-945F-C9DD48AB4D64/Documents/myFolder/myImage.JPG (index.js, line 36)
[Log] DEPRECATED: Update your code to use 'toURL' (Entry.js, line 202)

这表示相机和文件插件通过三种不同类型的URL:

  • 相机返回assets-library://网址,其中包含用于标识资产的查询参数
  • 调用resolveLocalFileSystemURL,将其转换为cdvfile:// URL,同时使用查询参数,作为内部Cordova表示。
  • 复制后,File返回一个新的file:/// URL,显示图像在文件系统上的新位置。此URL没有查询参数。 (在此条目上调用toNURURUR()现在返回相同的URL,从文件1.1.0开始)

这个最终的URL可以被iOS用作图像源,因此被分配给<img>元素。

答案 1 :(得分:0)

问题是,新的文件插件必须是区分大小写的。 我创建了一个大写字母的文件夹,并将copy-instruction引用到一个小写字母的文件夹。重点是android不区分大小写,而ios则不区分大小写。 这出现了新的文件插件,其中输出区分大小写。