我有一个使用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的结果:
错误消息:
DEPRECATED: Update your code to use 'toURL'
toURL无效
id="org.apache.cordova.file"
version="1.1.1-dev"
答案 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://
网址,其中包含用于标识资产的查询参数cdvfile://
URL,同时使用查询参数,作为内部Cordova表示。file:///
URL,显示图像在文件系统上的新位置。此URL没有查询参数。 (在此条目上调用toNURURUR()现在返回相同的URL,从文件1.1.0开始)这个最终的URL可以被iOS用作图像源,因此被分配给<img>
元素。
答案 1 :(得分:0)
问题是,新的文件插件必须是区分大小写的。 我创建了一个大写字母的文件夹,并将copy-instruction引用到一个小写字母的文件夹。重点是android不区分大小写,而ios则不区分大小写。 这出现了新的文件插件,其中输出区分大小写。