Я отправляю формданные в PHP, используя ajax.upload для загрузки файла в облачное хранилище 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 или как показать прогресс в этой ситуации.