【问题标题】:PhoneGap/Cordova FileTransfer.abort not working as expectedPhoneGap/Cordova FileTransfer.abort 未按预期工作
【发布时间】:2013-02-09 11:39:19
【问题描述】:

我正在编写一个例程,将图像从我的 iPhone(4S,iOS 6.1)上传到服务器。

var ft = undefined;

var e = document.getElementById('stopper');
e.addEventListener('click', onStopUploadBtn, false);

function uploadPhoto(imageURI) {

    console.log('Preparing to upload' + imageURI);

    ...

    ft = new FileTransfer();
    ft.onprogress = onProgress;
    ft.upload(imageURI, url, onUploadSuccess, onUploadError, uploadOptions);
    console.log('upload started');
}

function onStopUploadBtn() {
    if(ft) {
        console.log('Aborting');
        ft.abort(onUploadSuccess, onUploadError);
    }
}

function onProgress(progressEvent) {
    if (progressEvent.lengthComputable) {
        console.log(progressEvent.loaded / progressEvent.total);
}

function onUploadSuccess(response) {
    console.log("Code = " + response.responseCode);
    console.log("Response = " + response.response);
    console.log("Sent = " + response.bytesSent);
}

function onUploadError(error) {
    alert("An error has occurred: Code = " = error.code);
}

上传就像一个魅力,但我无法用 .abort() 阻止它。

实际上,当我按下停止按钮时,我看到 ft.abort() 被调用,但传输继续进行,直到 comp

这里是日志:

2013-02-09 12:29:18.422 HelloWorld[855:907] Multi-tasking -> Device: YES, App: YES

2013-02-09 12:29:22.496 HelloWorld[855:907] [LOG] opening camera

2013-02-09 12:29:30.728 HelloWorld[855:907] [LOG] Preparing to uploadfile://localhost/var/mobile/Applications/C82E5A93-D276-4380-8420-39165C9644C4/tmp/cdv_photo_014.jpg

2013-02-09 12:29:30.729 HelloWorld[855:907] [LOG] upload ready to go

2013-02-09 12:29:30.732 HelloWorld[855:907] -[CDVFileTransfer requestForUploadCommand:fileData:][Line 207] fileData length: 1016478
2013-02-09 12:29:30.734 HelloWorld[855:907] [LOG] upload started
2013-02-09 12:29:31.208 HelloWorld[855:907] [LOG] 0.03223007996537784
2013-02-09 12:29:31.210 HelloWorld[855:907] [LOG] 0.06446015993075568
2013-02-09 12:29:31.213 HelloWorld[855:907] [LOG] 0.09669023989613353

...

2013-02-09 12:29:32.057 HelloWorld[855:907] [LOG] 0.16511030894372916
2013-02-09 12:29:32.113 HelloWorld[855:907] [LOG] 0.167868278432954
2013-02-09 12:29:32.172 HelloWorld[855:907] [LOG] 0.17062624792217884

2013-02-09 12:29:32.188 HelloWorld[855:907] [LOG] Aborting
2013-02-09 12:29:32.191 HelloWorld[855:907] FileTransferError {
    code = 4;
    source = "file://localhost/var/mobile/Applications/C82E5A93-D276-4380-8420-39165C9644C4/tmp/cdv_photo_014.jpg";
    target = "...";
}

2013-02-09 12:29:32.229 HelloWorld[855:907] [LOG] 0.17338421741140367

...

2013-02-09 12:29:45.641 HelloWorld[855:907] [LOG] 0.9939470241666585
2013-02-09 12:29:45.698 HelloWorld[855:907] [LOG] 0.9967049936558833
2013-02-09 12:29:45.757 HelloWorld[855:907] [LOG] 0.9991324789267132
2013-02-09 12:29:45.813 HelloWorld[855:907] [LOG] 1
2013-02-09 12:30:17.200 HelloWorld[855:907] File Transfer Finished with response code 200
2013-02-09 12:30:17.203 HelloWorld[855:907] [LOG] Code = 200
2013-02-09 12:30:17.204 HelloWorld[855:907] [LOG] Response = 17
2013-02-09 12:30:17.205 HelloWorld[855:907] [LOG] Sent = 1016692

.abort() 被正确调用,因为我收到 API 的 http://docs.phonegap.com/en/2.3.0/cordova_file_file.md.html#FileTransfer 中所述的错误。

如日志所述,图像已正确传输到服务器。

你知道发生了什么吗?

【问题讨论】:

    标签: iphone cordova upload


    【解决方案1】:

    "if (progressEvent.lengthComputable) {" 没有匹配的右括号。

    可能是后续方法 onUploadSuccess 和 onUploadError 被破坏了。或者这只是您问题中的一个错字。

    顺便说一句,最好为每个 imageURI 保存一个 FileTransfer 引用,而不是使用对单个 FileTransfer 的全局引用。然后您可以一次上传多张照片,并且仍然保留单独取消每张上传的功能,例如

    // basic implementation of hash map of FileTransfer objects
    // so that given a key, an abort function can find the right FileTransfer to abort
    function SimpleHashMap()
    {
        this.items = {};
        this.setItem = function(key, value) { this.items[key] = value; }
        this.getItem = function(key)
                       {
                           if (this.hasItem(key)) { return this.items[key]; }
                           return undefined;                    
                       }
        this.hasItem = function(key) { return this.items.hasOwnProperty(key); }
        this.removeItem = function(key)
                          {
                              if (this.hasItem(key)) { delete this.items[key]; }
                          }
    }
    var fileTransferMap = new SimpleHashMap();            
    

    ...然后在uploadPhoto中创建一个新的FileTransfer:

    // register this object so that abort can find it
    fileTransferMap.setItem(imageURI, ft);
    

    ...然后在取消按钮中传递 imageURI:

    function onStopUploadBtn(imageURI)
    {
        var ft = fileTransferMap.getItem(imageURI);
        if (ft)
        {
            console.log('Aborting');
            ft.abort(onUploadSuccess, onUploadError);
        }
    }
    

    ...记得在下载完成或出错时从地图中删除 ft:

    fileTransferMap.removeItem(imageURI);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2021-06-04
      • 2022-01-24
      • 2015-05-11
      • 2020-05-15
      • 2014-10-31
      • 2018-02-12
      相关资源
      最近更新 更多