Возобновляемая загрузка с помощью ng-file-upload + PHP (Объединение частей)

Я пытаюсь реализовать нг-файлы для загрузки с режимом возобновляемых загрузок, чтобы разбить большие файлы на куски и объединить их после загрузки. Я реализовал ng-file-upload во многих проектах, но я впервые делаю это для загрузки таких больших файлов.

Моя проблема в том, что я не знаю, как заставить работать файлы на стороне сервера в PHP. Мне нужно загрузить куски с разными именами, но я не могу их объединить.

Может кто-нибудь опубликовать пример серверного кода в PHP, чтобы заставить работать эту функцию?

Это то, что я сделал до этого момента:

AngularJS

$scope.uploadMediaFile = function (file) {

if(file) {

Upload.upload({
ignoreLoadingBar: true,
url: 'app/api/upload/mediaFile.php',
resumeChunkSize: '1MB',
file: file
}).then(function (response) {
if(response.data.success) {
$scope.post.mediaFile = response.data.filename;
$scope.post.duration = response.data.duration;
} else {
console.error(response.data.error);
}
}, null, function (evt) {
console.log(part);
file.progress = Math.min(100, parseInt(100.0 * evt.loaded / evt.total));
});
}
};

mediaFile.php

$filename = $_FILES['file']['name'];
$file_tmp = $_FILES['file']['tmp_name'];

$file_ext = pathinfo($filename, PATHINFO_EXTENSION);

$file_des = $_SERVER['DOCUMENT_ROOT'] . '/storage/content/temp/';

if(!file_exists($file_des)) mkdir($file_des);

// Puting a diferent name for each file part
$new_filename = uniqid() . "." . pathinfo($filename, PATHINFO_EXTENSION);

move_uploaded_file($file_tmp, $file_des . $new_filename)

До сих пор я получаю много фрагментов одного и того же файла с разными именами.

2

Решение

На всякий случай, если кто-то ищет похожий вопрос, я выложу свое решение.

<?php
// File chunk
$filename = $_FILES['file']['name'];
$file_tmp = $_FILES['file']['tmp_name'];// Defining temporary directory

$file_des = $_SERVER['DOCUMENT_ROOT'] . '/storage/content/temp/';

// If not exists, create temp dir.
if(!file_exists($file_des)) mkdir($file_des);

// The first chunk have the original name of file uploaded
// so, if it exists in temp dir, upload the other pieces
// with anothers uniques names
if(file_exists($file_des . $filename)) {

$new_name = uniqid() . "." . pathinfo($filename, PATHINFO_EXTENSION);
move_uploaded_file($file_tmp, $file_des . $new_name);

// Now, append the chunk file to the first base file.
$handle = fopen($file_des . $new_name, 'rb');
$buff = fread($handle, filesize($file_des . $new_name));
fclose($handle);

$final = fopen($file_des . $filename, 'ab');
$write = fwrite($final, $buff);
fclose($final);

// Delete chunk
unlink($file_des . $new_name);

} else {

/* MAKE SURE WE DELETE THE CONTENT OF THE DESTINATION FOLDER FIRST,
OTHERWISE CHUNKS WILL BE APPENDED FOR EVER
IN CASE YOU ARE TRYING TO UPLOAD A FILE WITH THE EXACT SAME NAME.
CAREFUL: YOU MAY PREFER TO DELETE ONLY THE FILE
INSTEAD OF THE FOLDER'S CONTENT, IN THE CASE
YOUR FOLDER CONTAINS MORE THAN ONE FILE.
*/

$files_to_delete = glob($file_des."*"); // get all file names
foreach($files_to_delete as $file) // iterate files
{
if(is_file($file))
{
unlink($file); // delete file
}
}// First chunk of file with original name.
move_uploaded_file($file_tmp, $file_des . $filename);
}
1

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

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

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