mirror of
https://github.com/michalcz10/USB-RAID-Array.git
synced 2026-11-11 07:59:04 +00:00
86 lines
3.1 KiB
PHP
86 lines
3.1 KiB
PHP
<?php
|
|
require_once __DIR__ . '/../../includes/auth.php';
|
|
requireLogin('../../index.php');
|
|
requirePermission('upPer', 'You do not have permission to upload files.');
|
|
session_write_close();
|
|
require_once __DIR__ . '/../../config/config.php';
|
|
|
|
use phpseclib3\Net\SFTP;
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
|
|
http_response_code(400);
|
|
exit('No files received or invalid request.');
|
|
}
|
|
|
|
$currentPath = requireRemotePath($_POST['currentPath'] ?? $defaultPath, $defaultPath);
|
|
$sftp = initializeSFTP();
|
|
|
|
if (isset($_POST['create_dirs'])) {
|
|
$directories = json_decode($_POST['create_dirs'], true);
|
|
if (!is_array($directories)) {
|
|
http_response_code(400);
|
|
exit('Invalid directory list.');
|
|
}
|
|
foreach ($directories as $directory) {
|
|
$directoryPath = requireRemotePath(rtrim($currentPath, '/') . '/' . $directory, $currentPath);
|
|
if (!$sftp->is_dir($directoryPath) && !$sftp->mkdir($directoryPath, 0755, true)) {
|
|
http_response_code(500);
|
|
exit('Failed to create upload directory.');
|
|
}
|
|
}
|
|
}
|
|
|
|
$uploadedFiles = $_FILES['files'] ?? null;
|
|
if (!$uploadedFiles || empty($uploadedFiles['name'][0])) {
|
|
http_response_code(400);
|
|
exit('No files received or file size exceeds PHP limits.');
|
|
}
|
|
|
|
$uploadErrors = [
|
|
UPLOAD_ERR_INI_SIZE => 'File exceeds upload_max_filesize directive in php.ini',
|
|
UPLOAD_ERR_FORM_SIZE => 'File exceeds MAX_FILE_SIZE directive in the HTML form',
|
|
UPLOAD_ERR_PARTIAL => 'File was only partially uploaded',
|
|
UPLOAD_ERR_NO_FILE => 'No file was uploaded',
|
|
UPLOAD_ERR_NO_TMP_DIR => 'Missing a temporary folder',
|
|
UPLOAD_ERR_CANT_WRITE => 'Failed to write file to disk',
|
|
UPLOAD_ERR_EXTENSION => 'A PHP extension stopped the file upload',
|
|
];
|
|
$uploadMessages = [];
|
|
$anySuccess = false;
|
|
$failureStatus = 500;
|
|
|
|
foreach ($uploadedFiles['tmp_name'] as $index => $temporaryPath) {
|
|
$fileName = $uploadedFiles['name'][$index];
|
|
$relativePath = $_POST['paths'][$index] ?? '';
|
|
$uploadError = $uploadedFiles['error'][$index];
|
|
if ($uploadError !== UPLOAD_ERR_OK) {
|
|
$failureStatus = 400;
|
|
$uploadMessages[] = $fileName . ': ' . ($uploadErrors[$uploadError] ?? 'Unknown upload error');
|
|
continue;
|
|
}
|
|
|
|
$remotePath = requireRemotePath(rtrim($currentPath, '/') . '/' . ($relativePath !== '' ? $relativePath : $fileName), $currentPath);
|
|
if ($remotePath === $currentPath) {
|
|
http_response_code(400);
|
|
exit('Invalid upload path.');
|
|
}
|
|
$directoryPath = remoteDirname($remotePath);
|
|
if (!$sftp->is_dir($directoryPath) && !$sftp->mkdir($directoryPath, 0755, true)) {
|
|
$uploadMessages[] = 'Failed to create directory for: ' . $fileName;
|
|
continue;
|
|
}
|
|
|
|
if ($sftp->put($remotePath, $temporaryPath, SFTP::SOURCE_LOCAL_FILE)) {
|
|
$uploadMessages[] = 'Uploaded: ' . ($relativePath !== '' ? $relativePath : $fileName);
|
|
$anySuccess = true;
|
|
} else {
|
|
$uploadMessages[] = 'Failed to upload: ' . ($relativePath !== '' ? $relativePath : $fileName);
|
|
}
|
|
}
|
|
|
|
if (!$anySuccess) {
|
|
http_response_code($failureStatus);
|
|
}
|
|
header('Content-Type: text/plain; charset=UTF-8');
|
|
echo implode("\n", $uploadMessages);
|