36143-vm/api/import.php
2025-11-23 18:39:57 +00:00

112 lines
3.4 KiB
PHP

<?php
require_once __DIR__ . '/../db/config.php';
header('Content-Type: application/json');
$response = [
'success' => false,
'files' => [],
'errors' => []
];
function getUploadErrorMessage($errorCode) {
switch ($errorCode) {
case UPLOAD_ERR_INI_SIZE:
return 'The uploaded file exceeds the upload_max_filesize directive in php.ini.';
case UPLOAD_ERR_FORM_SIZE:
return 'The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.';
case UPLOAD_ERR_PARTIAL:
return 'The uploaded file was only partially uploaded.';
case UPLOAD_ERR_NO_FILE:
return 'No file was uploaded.';
case UPLOAD_ERR_NO_TMP_DIR:
return 'Missing a temporary folder.';
case UPLOAD_ERR_CANT_WRITE:
return 'Failed to write file to disk.';
case UPLOAD_ERR_EXTENSION:
return 'A PHP extension stopped the file upload.';
default:
return 'Unknown upload error.';
}
}
if (!isset($_FILES['photos'])) {
$response['errors'][] = 'No files were sent. The key "photos" is missing from the request.';
echo json_encode($response);
exit;
}
$upload_dir = __DIR__ . '/../assets/uploads/';
if (!is_dir($upload_dir)) {
if (!mkdir($upload_dir, 0775, true)) {
$response['errors'][] = 'Failed to create upload directory: ' . $upload_dir;
echo json_encode($response);
exit;
}
}
if (!is_writable($upload_dir)) {
$response['errors'][] = 'The upload directory is not writable: ' . $upload_dir;
echo json_encode($response);
exit;
}
$files = $_FILES['photos'];
$file_count = count($files['name']);
$successful_uploads = 0;
try {
$pdo = db();
$stmt = $pdo->prepare(
'INSERT INTO photos (filename, filepath, filesize) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE updated_at = CURRENT_TIMESTAMP'
);
} catch (PDOException $e) {
$response['errors'][] = 'Database connection failed: ' . $e->getMessage();
error_log('DB Connection Error: ' . $e->getMessage());
echo json_encode($response);
exit;
}
for ($i = 0; $i < $file_count; $i++) {
$errorCode = $files['error'][$i];
$filename = basename($files['name'][$i]);
if ($errorCode !== UPLOAD_ERR_OK) {
$response['errors'][] = "Error uploading '$filename': " . getUploadErrorMessage($errorCode);
continue;
}
$filepath = $upload_dir . $filename;
$relative_path = 'assets/uploads/' . $filename;
if (!move_uploaded_file($files['tmp_name'][$i], $filepath)) {
$response['errors'][] = "Failed to move uploaded file '$filename'. Check permissions and paths.";
continue;
}
try {
$stmt->execute([$filename, $relative_path, $files['size'][$i]]);
$response['files'][] = [
'filename' => $filename,
'filepath' => $relative_path
];
$successful_uploads++;
} catch (PDOException $e) {
$response['errors'][] = "Failed to save file '$filename' to database: " . $e->getMessage();
error_log("DB Insert Error for $filename: " . $e->getMessage());
// Optionally, delete the file if DB insert fails
// unlink($filepath);
}
}
if ($successful_uploads > 0) {
$response['success'] = true;
}
if ($successful_uploads < $file_count) {
$response['success'] = false; // Mark as failure if any file failed
}
echo json_encode($response);