【问题标题】:phonegap filereader onloadend doesn't workphonegap filereader onloadend 不起作用
【发布时间】:2013-11-19 13:49:48
【问题描述】:

我正在使用phonegap拍照并将其放入img容器中。

navigator.camera.getPicture(onSuccess, onFail);

var onSuccess =  function(imageURI) {
        var pic = document.getElementById('picture');
        pic.style.display = 'block';
        pic.src = imageURI;
};

var onFail = function(message) {
        $('#infoField').val(message);
};

效果很好。现在我想用一种格式加载图片,以便能够通过 websocket 发送它。因此我使用 fileReader 并将类型设置为 dataUrl。

var reader = new FileReader();

reader.onloadend = function(evt) {
      $('textarea#textarea1').val("evt triggered");
      //var socket = io.connect(addr);
      //socket.emit('mobilePicture', "works");
};

reader.readAsDataURL(document.getElementById('picture').src);

不幸的是,什么也没发生。无论如何都不会触发 onloadend 事件。有什么想法吗?

【问题讨论】:

  • 只是为了确定,您只有在收到来自getPictureonSuccess 回调后才开始读取文件,对吧?
  • 是的,我通过按一个按钮来启动阅读器..当然是在拍照之后:)
  • 可能是路径错误? file:///storage/emulated/[...]/123.jpg 我把它改成了 file://storage ......但这也不起作用..也许其他的东西有问题
  • 您必须将代码的第二部分放在onSuccess 方法中

标签: html cordova cordova-2.0.0 cordova-3


【解决方案1】:

尝试像这样重新排列您的代码:

var onSuccess =  function(imageURI) {
        var pic = document.getElementById('picture');
        pic.style.display = 'block';
        pic.src = imageURI;

        var reader = new FileReader();

        reader.onloadend = function(evt) {
              $('textarea#textarea1').val("evt triggered");
              //var socket = io.connect(addr);
              //socket.emit('mobilePicture', "works");
        };

        reader.readAsDataURL(imageURI);
};

var onFail = function(message) {
        $('#infoField').val(message);
};

navigator.camera.getPicture(onSuccess, onFail);

您必须将file object 传递给file.reader 而不仅仅是文件的路径。

编辑/更新:
要首先通过路径在文件系统上查找文件,您需要使用fileSystem 创建一个fileEntry

示例

window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, gotFS, fail);

function gotFS(fileSystem) {
    fileSystem.root.getFile("readme.txt", {create: true, exclusive: false}, gotFileEntry, fail);
}

function gotFileEntry(fileEntry) {
    //fileEntry
    alert("Got the fileEntry!");
    reader.readAsDataURL(fileEntry);
    ...
}

【讨论】:

  • 看起来不错,不幸的是我从 window.requestFileSystem 收到错误代码:5 ...我正在检查它的来源。 (我的应用程序使用 require.js+backbonejs)
  • 我使用 window.resolveLocalFileSystemURI(document.getElementById('picture').src, gotFileEntry, fail);而不是 root.getFile ... 可以解决 .. 感谢您的帮助 benka :)
【解决方案2】:

使用 readAsDataURL 仍可能导致图像损坏,尤其是在 iOS 中。经过数小时的测试和研究,我可以确认其他用户使用 readAsBinaryString() 的发现,这也改变了处理 onloadend 代码。

参考帖子位于: Cordova - Reading Large Image corrupts image

要扩展 @benka 示例并合并 iOS 满意的命令,代码可能如下所示:

var onSuccess =  function(imageURI) {
var pic = document.getElementById('picture');
pic.style.display = 'block';
pic.src = imageURI;

var reader = new FileReader();

reader.onloadend = function(evt) {
  $('textarea#textarea1').val("evt triggered");
  //var socket = io.connect(addr);
  //socket.emit('mobilePicture', "works");
  var base64 = window.btoa(evt.target.result); // Send this to a server.
  var image.src = "data:image/jpeg;base64," + base64 ; // Use if you need a html src reference.
};

  reader.readAsBinaryString(imageURI);
};

var onFail = function(message) {
  $('#infoField').val(message);
};

navigator.camera.getPicture(onSuccess, onFail);

【讨论】:

  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review
  • 谢谢@michael-gaskill,我添加了一个新示例来合并提议的编辑。
猜你喜欢
  • 2023-04-02
  • 1970-01-01
  • 1970-01-01
  • 2015-05-20
  • 2016-07-16
  • 2017-05-28
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
相关资源
最近更新 更多