113 lines
4.0 KiB
PHP
113 lines
4.0 KiB
PHP
<?php
|
||
|
||
|
||
|
||
// Настройки загрузки
|
||
$uploadDir = '../../../userdata/Videos/';
|
||
|
||
// Убедимся, что директория существует
|
||
if (!is_dir($uploadDir)) {
|
||
mkdir($uploadDir, 0755, true);
|
||
}
|
||
|
||
// Получение параметров из запроса
|
||
$chunkIndex = isset($_POST['dzchunkindex']) ? (int)$_POST['dzchunkindex'] : 0;
|
||
$totalChunks = isset($_POST['dztotalchunkcount']) ? (int)$_POST['dztotalchunkcount'] : 1;
|
||
$fileName = isset($_POST['dzdestinationfile']) ? $_POST['dzdestinationfile'] : '';
|
||
$uuid = isset($_POST['dzuuid']) ? $_POST['dzuuid'] : '';
|
||
|
||
// Проверка входных данных
|
||
if (empty($fileName)) {
|
||
die(json_encode(['success' => false, 'message' => 'Имя файла не указано']));
|
||
}
|
||
|
||
// Создадим подпапку для временных чанков, чтобы избежать конфликтов
|
||
$tempDir = $uploadDir . 'temp_' . $uuid . '/';
|
||
if (!is_dir($tempDir)) {
|
||
mkdir($tempDir, 0755, true);
|
||
}
|
||
|
||
// Путь к временному файлу
|
||
$tempFilePath = $tempDir . $chunkIndex;
|
||
|
||
// Проверка загружаемого файла
|
||
if (!isset($_FILES['file']) || $_FILES['file']['error'] != UPLOAD_ERR_OK) {
|
||
die(json_encode([
|
||
'success' => false,
|
||
'message' => 'Ошибка загрузки файла: ' .
|
||
(isset($_FILES['file']) ? $_FILES['file']['error'] : 'Файл не был отправлен')
|
||
]));
|
||
}
|
||
|
||
// Сохраняем загруженный чанк
|
||
if (move_uploaded_file($_FILES['file']['tmp_name'], $tempFilePath)) {
|
||
// Проверяем, все ли чанки загружены
|
||
$allChunksUploaded = true;
|
||
|
||
for ($i = 0; $i < $totalChunks; $i++) {
|
||
if (!file_exists($tempDir . $i)) {
|
||
$allChunksUploaded = false;
|
||
break;
|
||
}
|
||
}
|
||
|
||
// Если загружены все части, объединяем их
|
||
if ($allChunksUploaded) {
|
||
$finalFilePath = $uploadDir . $fileName;
|
||
$finalFile = fopen($finalFilePath, 'wb');
|
||
|
||
if (!$finalFile) {
|
||
die(json_encode([
|
||
'success' => false,
|
||
'message' => 'Не удалось создать итоговый файл'
|
||
]));
|
||
}
|
||
|
||
// Объединяем все куски в один
|
||
for ($i = 0; $i < $totalChunks; $i++) {
|
||
$chunkPath = $tempDir . $i;
|
||
$chunkFile = fopen($chunkPath, 'rb');
|
||
|
||
if (!$chunkFile) {
|
||
fclose($finalFile);
|
||
die(json_encode([
|
||
'success' => false,
|
||
'message' => 'Не удалось открыть чанк ' . $i
|
||
]));
|
||
}
|
||
|
||
// Потоковое копирование для экономии памяти
|
||
while (!feof($chunkFile)) {
|
||
fwrite($finalFile, fread($chunkFile, 8192)); // Чтение и запись блоками по 8KB
|
||
}
|
||
|
||
fclose($chunkFile);
|
||
unlink($chunkPath); // Удаляем временный кусок
|
||
}
|
||
|
||
fclose($finalFile);
|
||
|
||
// Удаляем временную директорию
|
||
rmdir($tempDir);
|
||
|
||
// Возвращаем успешный результат
|
||
echo json_encode([
|
||
'success' => true,
|
||
'message' => 'Файл успешно загружен',
|
||
'file' => $fileName,
|
||
'path' => $finalFilePath
|
||
]);
|
||
} else {
|
||
// Не все чанки загружены, сообщаем о частичной загрузке
|
||
echo json_encode([
|
||
'success' => true,
|
||
'message' => 'Часть ' . ($chunkIndex + 1) . ' из ' . $totalChunks . ' успешно загружена'
|
||
]);
|
||
}
|
||
} else {
|
||
echo json_encode([
|
||
'success' => false,
|
||
'message' => 'Ошибка при сохранении файла'
|
||
]);
|
||
}
|
||
?>
|