我正在使用ajax.upload将formdata发送到PHP,以将文件上传到Google云存储
Javascript:
var ajax = new XMLHttpRequest();
//PROGRESS HANDLER
ajax.upload.addEventListener("progress", function(event) {
var percent = ((event.loaded / event.total) * 100);
console.log(Math.round(percent) + "% uploading... please wait");
}, false);
//COMPLETE HANDLER
ajax.addEventListener("load", function(event) {
console.log(event.target.responseText);
}, false);
//ERROR HANDLER
ajax.addEventListener("error", function(event) {
console.log("Upload Failed");
}, false);
//ABORT HANDLER
ajax.addEventListener("abort", function(event) {
console.log("Upload Aborted");
}, false);
ajax.open("POST", "api/storage.php");
ajax.send(formdata);
PHP:
$_SESSION['storedBytes'] = 0;
$_SESSION['fileSize'] = $file["size"];
$uploader = $bucket->getResumableUploader(
fopen($fileTmpLoc, 'r'),
[
'predefinedAcl' => 'publicRead',
'name' => $_POST['uniqueName'],
'resumable' => true,
'chunkSize' => 262144,
'uploadProgressCallback' => 'uploadProgress'
]
);
try {
$object = $uploader->upload();
} catch (GoogleException $ex) {
$resumeUri = $uploader->getResumeUri();
$object = $uploader->resume($resumeUri);
}
function uploadProgress($storedBytes)
{
if (isset($_SESSION['storedBytes'])) {
$_SESSION['storedBytes'] += $storedBytes;
} else {
$_SESSION['storedBytes'] = $storedBytes;
}
$storedBytes = $_SESSION['storedBytes'];
$totalSize = $_SESSION['fileSize'];
$_SESSION['progress'] = ($storedBytes*100)/$totalSize;
echo "Progress ".$_SESSION['progress'];
}
我在uploadProgress函数中收到了正确的进度值,但是如何将该值异步发送到ajax请求响应,或者在这种情况下如何显示进度。
答案 0 :(得分:0)
我会在您的JavaScript Ajax调用中使用Promise。一个jQuery示例就是这样:
// gets the state of the upload from the PHP server.
var getProgress = function(phpUrlForProgress){
return $.ajax({
url: phpUrlForProgress,
type: 'get'
});
};
var keepCheckingProgress = function(phpUrlForProgress){
var deferred = $.Deferred();
var intervalID = setInterval(function(){
getProgress(phpUrlForProgress).done(function(response){
console.log(response); // see what the response looks like.
// you might need to parse the response into JSON before your if() statement.
if(response.percentComplete === 100) {// You are done with the upload
clearInterval(intervalID); // stops the setInterval loop;
deferred.resolve(response);
} else {
// some code to display a progress bar or whatever.
}
});
}, 3000);// setInterval function repeats every 3 seconds until cleared.
return deferred.promise();
};
// initiates the upload.
$.ajax({
url: phpUrlForUpload,
type: 'post'
data: formdata
});
// now start checking for upload progress.
var finished = keepCheckingProgress();
$.when(finished).then(function(){
// do something now that the upload is 100% done
});
请注意,我还没有机会测试此代码中的错误或错误,只是为了给您一个思路。
基本上,Promise是将一些操作顺序带给Javascript的一种方法,这是异步的。可以说,完成此任务后,还要执行其他一些任务。
jQuery,我相信使用的Promise实现与其他Promise库略有不同。可以在here上找到有关诺言的一般入门知识。