angularjs — обрабатывает загруженные файлы чанка в Stack Overflow

Я использую угловую загрузку ng для загрузки файла, вот мой код JavaScript:

$scope.uploadFile = function(file) {
Upload.upload({
url: '/upload_image',
resumeChunkSize: '1MB',
data: {file: file}
}).then(function(response) {
console.log('success');
});
};

Поскольку я загружаю файл кусками, я хочу, чтобы бэкэнд php прочитал и конкатенировал эти куски обратно, теперь, как мне это сделать? Мой текущий php-код выглядит так:

$filename = $_FILES['file']['name'];
$destination = '/someDestinationPath/' . $filename;
move_uploaded_file( $_FILES['file']['tmp_name'] , $destination );

Тем не менее, я почти уверен, что это не сработает при загрузке фрагментов …

1

Решение

Хорошо, я понял. При использовании функции загрузки чанка некоторых библиотек javascript они передают в бэкэнд параметры информации о чанке. В случае ng-file-upload эти параметры являются _chunkNumber, _chunkSize и _totalSize. Я верю в то же самое для Plupload. Сделайте математику, и вы узнаете, сколько кусков нужно, чтобы этот файл завершил загрузку. Для каждой загрузки чанка будет отправлен один http-запрос на серверную часть PHP. Хватит говорить, код здесь:

PHP:

    // uid is used to identify chunked partial files so we can assemble them back when all chunks are finished uploading
$uid = $_REQUEST['uid'];
$filename = $_REQUEST['filename'];
if (empty($_FILES['file']['name'])) {
return '';
}
if (isset($_POST['_chunkNumber'])) {
// the file is uploaded piece by piece, chunk mode
$current_chunk_number = $_REQUEST['_chunkNumber'];
$chunk_size = $_REQUEST['_chunkSize'];
$total_size = $_REQUEST['_totalSize'];

$upload_folder = base_path() . '/public/images/uploaded/';
$total_chunk_number = ceil($total_size / $chunk_size);
move_uploaded_file($_FILES['file']['tmp_name'], $upload_folder . $uid . '.part' . $current_chunk_number);
// the last chunk of file has been received
if ($current_chunk_number == ($total_chunk_number - 1)) {
// reassemble the partial pieces to a whole file
for ($i = 0; $i < $total_chunk_number; $i ++) {
$content = file_get_contents($upload_folder . $uid . '.part' . $i);
file_put_contents($upload_folder . $filename, $content, FILE_APPEND);
unlink($upload_folder . $uid . '.part' . $i);
}

}
} else {
// the file is uploaded as a whole, no chunk mode
move_uploaded_file($_FILES['file']['tmp_name'], $upload_folder . $filename);
}

Javascript (angularjs и ng-file-upload):

Upload.upload({
url: '/upload_image',
resumeChunkSize: '500KB',
data: {
filename: file.name
file: file
uid: toolbox.generateUniqueID()
}
}).then(function(response) {
console.log('success');
}), function(response) {
console.log('error');
});
1

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

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