0

我正在使用文件文件传输插件并将一些图像文件下载到模拟器。但是当我尝试使用下载的图像时,它们不会出现。标签为空,<img>好像src属性错误。

我注意到下载到手机的文件几乎是服务器发送回的响应大小的两倍,这可能是我无法在模拟器上本地查看图像的原因吗?还是我错过了其他东西?

下载测试图像并查看的示例代码:

requestFileSystem(LocalFileSystem.PERSISTENT, 7 * 1024 * 1024, function(fs) {
    var ft = new FileTransfer(),
        localPath = fs.root.toURL() +'/bblogo.png';
    
    ft.download('http://developer.blackberry.com/webroot/img/common/bblogo-black.png', localPath, function(entry) {
        console.log('download success!');
        console.log(entry);
        entry.file(function(file) {console.log(file.size)});
            document.getElementById('test-image').src = localPath;
    }, function(e) { console.log('download error'); console.log(e); })
});

在我电脑上的模拟器中,这会报告:

下载成功!
对象
4412

有问题的文件在我的计算机上2818字节。

$ wget http://developer.blackberry.com/webroot/img/common/bblogo-black.png
$ wc -c bblogo-black.png
2818 bblogo-black.png

我修改了 FileTransfer 插件的本地副本并查看了 XHR 响应长度,它与文件的大小相对应。iOS 磁盘上报告的下载文件与我计算机上的大小相同。

我用我的测试代码创建了一个GitHub 存储库,以防有人想尝试一下。请注意,它不适用于 iOS,因为localPath它设置为fs.root.toURL()而不是fs.root.fullPath.

更新

我想我应该尝试看看是否可以在我的计算机和模拟器中上传相同大小的文件,然后查看是否可以查看该文件。我失败了,我仍然无法在设备上查看文件。

所以我用 Base64 编码了一个 10x10 像素的粉色 png,然后尝试在手机上创建该文件。并且文件大小也略有不同。在我的计算机上,文件为942字节,设备上报告的文件大小为942。在 iOS 上测试它会创建文件,之后也可以查看它。但不是在黑莓上。

查看其他人的示例,我应该将文件保存到blackberry.io.shared,但我根本无法访问全局变量 blackberry。查看文档,我猜该路径应该是,/accounts/1000/shared但尝试访问只是失败且不存在。accountsfs.root.getDirectoryaccounts

尝试使用Base64Binary将 base64 编码文件添加到设备的代码:

var imageBase64 = 'iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAMAAAC67D+PAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoxRDZDMEZFNTJGMkExMUUzQTA1NDgxOUY4RTYwN0MzNiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoxRDZDMEZFNjJGMkExMUUzQTA1NDgxOUY4RTYwN0MzNiI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjFENkMwRkUzMkYyQTExRTNBMDU0ODE5RjhFNjA3QzM2IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjFENkMwRkU0MkYyQTExRTNBMDU0ODE5RjhFNjA3QzM2Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+9WDqKgAAAAZQTFRF/wDwAAAAx8UEpAAAAA5JREFUeNpiYKAnAAgwAABuAAEcD8SQAAAAAElFTkSuQmCC';

requestFileSystem(LocalFileSystem.PERSISTENT, 7 * 1024 * 1024, function(fs) {
    var ft = new FileTransfer(),
        localPath = fs.root.toURL() +'hot-pink.png';
        
    fs.root.getFile('hot-pink.png', {create: true}, function(entry) {
        entry.createWriter(function(writer) {
            writer.onwriteend = function(e) {
                console.log('writeend');
                console.log(e.target);
            }
            writer.onerror = function(e) {
                console.log('write error');
                console.log(e.target.error);
            }
            
            writer.write(Base64Binary.decodeArrayBuffer(imageBase64))
        }, function(error) {
            console.log('error creating writer');
            console.log(error);
        })
    }, function(error) {
        console.log('error getting file');
        console.log(error);
    })
})


requestFileSystem(LocalFileSystem.PERSISTENT, 7 * 1024 * 1024, function(fs) {
    console.log(fs.root.toURL());
    var path = fs.root.toURL() + '/hot-pink.png';
    console.log(path);
    resolveLocalFileSystemURI(path, function(entry) {
        console.log('success accessing '+ path);
        console.log(entry);
        console.log(entry.toURL())
        entry.file(function(file) {
            console.log('success accessing file');
            console.log(file.size);
        }, function(error) {
            console.log('error accessing file');
            console.log(e);
        })
    }, function(error) {
        console.log('error accessing '+ path);
        console.log(error);
    })
}, function(error) {
    console.log('error accessing filesystem');
    console.log(error);
});

更新 2

我注意到上面的代码没有正确处理 Base64,现在已通过将Base64Binary添加到全局命名空间来纠正它。之后,添加到 BlackBerry 和 iOS 的文件大小相同。在 iOS 上,如果我使用报告toURL但不能在 BlackBerry 上显示文件,它可以显示文件。

4

1 回答 1

0

你试过用这个电话吗

window.webkitRequestFileSystem(window.PERSISTENT, 5*1024*1024, onSuccess, null);

而不是 Cordova / Phonegap 的电话

window.requestFileSystem(LocalFileSystem.PERSISTENT, 5*1024*1024, onSuccess, null);
于 2013-12-19T07:32:46.333 回答