Iphone PhoneGap/Cordova FileTransfer.abort未按预期工作
我正在编写一个例程,将图像从iPhone(4S,iOS 6.1)上传到服务器Iphone PhoneGap/Cordova FileTransfer.abort未按预期工作,iphone,cordova,upload,Iphone,Cordova,Upload,我正在编写一个例程,将图像从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); ..
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()阻止它
事实上,当我按下stopper按钮时,我看到调用了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中声明的错误
如日志所示,映像已正确传输到服务器
你知道发生了什么吗?“如果(progressEvent.lengthComputeable){”
没有匹配的结束括号
它可能是破坏了后续的方法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();
…然后在创建新文件传输后的上载照片中:
// 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);