2013-10-17 79 views
0

我使用filefile-transfer插件并下载一些图像文件到模拟器。但是当我尝试使用下载的图像时,他们没有出现。 <img>标记为空,就好像src属性错误。黑莓10 Cordova/PhoneGap 3.1 FileTransfer图像下载不显示在设备上

我注意到,下载到手机中的文件是从服务器发回的响应几乎两倍的大小,可能这就是为什么我不能在本地查看模拟器上的图像?还是我错过了别的?

Example code下载测试图像,并查看它:

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); }) 
}); 

在模拟器我的电脑上这个报告回:

下载成功!
对象

问题中的文件是我的电脑个字节。

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

我修改了本地的文件传输插件的副本,看着XHR响应长度并且它与文件的大小相对应。在iOS上的磁盘上报告的下载文件与我的电脑上的大小相同。

我已经创建了一个GitHub repository在有人的情况下我的测试代码,想给它一个尝试。请注意,它不会开箱与iOS工作,因为localPath设置为fs.root.toURL(),而不是fs.root.fullPath

更新

我想,我应该尝试看看,如果我能得到一个文件上传的大小是一样的我的电脑上,并在模拟器,然后看看我是否可以查看该文件。我失败了,我仍然无法查看设备上的文件。

所以我Base64编码的10×10像素的粉红色PNG,然后试图建立手机上的文件。而且文件大小也有一些细微差别。在我的电脑文件在设备字节和报告的文件大小是。在iOS上测试它会创建该文件,并且之后也可以查看它。但不在黑莓上。

看着其他人的例子,我应该将该文件保存到​​,但我根本无法访问全局变量blackberry。看着the documentation我猜路径应该是/accounts/1000/shared但在尝试访问accountsfs.root.getDirectory只是失败,accounts不存在。

代码试图添加编码文件到设备一个base64,使用Base64Binary

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,则可以显示该文件。

+0

我已经得到了来自黑莓手机上他们的论坛的回应,他们说,“有一个通过entry.toURL访问沙盒文件“和”我们正在调查cordova文件API的补丁以解决此问题“。 http://supportforums.blackberry.com/t5/Web-and-WebWorks-Development/PhoneGap-Cordova-downloading-file-to-device-and-then-view-it/m-p/2631507 – gaqzi

回答

0

你有没有尝试使用此调用,而不是科尔多瓦/ PhoneGap的的号召

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

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