Загрузка функций паузы / возобновления в корзину S3 с HTML5 и переполнением стека

Мне нужна помощь в реализации функции приостановки / возобновления загрузки файлов. В настоящее время загрузчик работает, как задумано, за пределами плохих интернет-условий. У нас были случаи, когда пользовательский файл был загружен в нашу корзину для загрузки поврежденных и поврежденных. Способ облегчить эту проблему — реализовать эту функцию для загрузчика. Наш текущий раздел для многочастной загрузки

instructorUpload.js

/**
* Begins AWS S3 Multipart Upload for object creation in S3
*
* @param {Object} i   - File index
* @param {Number} key - Unique key for file upload
*/
function createMultipartUpload(i, key){
var formdata = new FormData();
formdata.append("command"  , 'CreateMultipartUpload');
formdata.append("fileindex", i                      );
formdata.append("key"      , key                    );
var xhr = request(false, "/api/UploadFile_v0/FileUploader.php", new   XMLHttpRequest(), formdata);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4)
uploadPart(JSON.parse(xhr.responseText), 1);
};
}
/**
* Upload indivdual part for AWS S3 Multipart Upload for object creation in S3
*
* @param {Object} sendBackData - Parsed JSON information receive after POST is complete
* @param {Number} partNum    - File chunk index
*
* @returns
*/
function uploadPart(data, partNum){
var fileIndex = data['fileindex'];
var file    = files[fileIndex];
if (partNum > Math.ceil(file.size / chunkSize)) {
completeMultipartUpload(data);
return;
}
var blobs = chunkFile(file, partNum);
var formdata = new FormData();
for(var i = 0; i < blobs.length; i++)
formdata.append("file[]", blobs[i]);
formdata.append("command", 'UploadPart');
formdata.append("uploadId", data['uploadId']);
formdata.append("key", data['key']);
formdata.append("partNumber", partNum);
var xhr = request(true, "/api/UploadFile_v0/FileUploader.php", new XMLHttpRequest(), formdata);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4)
uploadPart(data, partNum + 1);
};
}
/**
* Completes Multipart Upload
*
* @param {Object} data - Parsed JSON information receive after POST is complete
*/
function completeMultipartUpload(data) {
var fileIndex = data['fileindex'];
var file = files[fileIndex];
var type = file.type.split("/")[0];
var formdata = new FormData();
var key = data['key'];
formdata.append("command" , 'CompleteMultipartUpload');
formdata.append("uploadId", data['uploadId']);
formdata.append("key", key);
var xhr = request(false, "/api/UploadFile_v0/FileUploader.php", new XMLHttpRequest(), formdata);
xhr.onreadystatechange = function() {
if (xhr.readyState === 4) {
var sendBackData = JSON.parse(xhr.responseText);
if(sendBackData['success']){
if(type === "video")
elasticTranscoder(data['key'], file.name);
var urlEmbed = "";
if(type === "video"){
urlEmbed = createEmbed((key.split('.')[0]+"/"+key.split("/")[key.split("/").length - 1]).split(".")[0]);
} else {
urlEmbed = '<img alt="Embed Imgage" height="100%" width="100%" src="' + sendBackData['url'] + '"/>';
}
directoryInsert(fileIndex, urlEmbed, type);
}
}
};
}

FileUpload.php

function s3Command($command){
switch ($command) {
case 'CreateMultipartUpload':
$fileindex = $_POST['fileindex'];
$key       = preg_replace('/\s+/', '_', $_POST['key']);

$response = $GLOBALS["s3"]->createMultipartUpload(array(
'Bucket' => TMP_IMG,
'Key'    => $key,
'ACL'    => 'public-read'
));

$uploadId = $response['UploadId'];

sendJson(array(
'uploadId'  => $uploadId,
'key'       => $key,
'fileindex' => $fileindex
));
break;

case 'UploadPart':
$key       = preg_replace('/\s+/', '_', $_POST['key']);
$tmp_files = $_FILES['file'];
$files    = array();
for ($i = 0; $i < count($tmp_files['name']); $i++){
$files[] = array(
'name'     => $tmp_files['name'][$i],
'tmp_name' => $tmp_files['tmp_name'][$i],
'type'     => $tmp_files['type'][$i],
'size'     => $tmp_files['size'][$i],
'error'    => $tmp_files['error'][$i]
);
}

$body = mergeFiles($files);

$result = $GLOBALS["s3"]->uploadPart(array(
'Bucket'     => TMP_IMG,
'Key'        => $key,
'UploadId'   => $_POST['uploadId'],
'PartNumber' => $_POST['partNumber'],
'Body'       => $body
));
break;

case 'CompleteMultipartUpload':
$key       = preg_replace('/\s+/', '_', $_POST['key']);
$partsModel = $GLOBALS["s3"]->listParts(array(
'Bucket'   => TMP_IMG,
'Key'      => $key,
'UploadId' => $_POST['uploadId']
));

$model = $GLOBALS["s3"]->completeMultipartUpload(array(
'Bucket'   => TMP_IMG,
'Key'      => $key,
'UploadId' => $_POST['uploadId'],
'Parts'    => $partsModel['Parts'],
));

$url = $GLOBALS["s3"]->getObjectUrl(TMP_IMG, $key);
$tmp  = explode('.', $key);
$type = getFileType(end($tmp));

if($type == 'image'){
$url = resizeImage($url);
}
else if($type != 'video'){
copyObject($key, FINISHED_IMG);
$url = $GLOBALS["s3"]->getObjectUrl(FINISHED_IMG, $key);
}

sendJson(array(
'success' => true,
'url'     => $url,
'key'     => $key,
'type'    => $type
));
break;

case 'AbortMultipartUpload':
$key = preg_replace('/\s+/', '_', $_POST['key']);
$s3->abortMultipartUpload(array(
'Bucket'   => TMP_IMG,
'Key'      => $key,
'UploadId' => $_POST['uploadId']
));
break;

default:
# code...
break;
}
}

Из того, что я собрал, мне нужен файл, его ключ, идентификатор загрузки и какие части были успешно загружены. Есть ли какие-либо предложения о том, что я могу сделать, чтобы достичь этого?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]