planbuild.php 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <?php
  2. define('UPLOAD_DIR', __DIR__ . '/pdf');
  3. define('MAX_UPLOAD_BYTES', 20 * 1024 * 1024); // 20 MB
  4. // Check file present and no upload error
  5. if (!isset($_FILES['pdf']) || $_FILES['pdf']['error'] !== UPLOAD_ERR_OK) {
  6. http_response_code(400);
  7. echo 'PDF upload failed';
  8. exit;
  9. }
  10. // Size limit
  11. if ($_FILES['pdf']['size'] > MAX_UPLOAD_BYTES) {
  12. http_response_code(413);
  13. echo 'File too large';
  14. exit;
  15. }
  16. // MIME type validation
  17. $finfo = new finfo(FILEINFO_MIME_TYPE);
  18. $mime = $finfo->file($_FILES['pdf']['tmp_name']) ?: '';
  19. if ($mime !== 'application/pdf') {
  20. http_response_code(415);
  21. echo 'Only PDF files are accepted';
  22. exit;
  23. }
  24. // Extension validation
  25. $ext = strtolower(pathinfo($_FILES['pdf']['name'], PATHINFO_EXTENSION));
  26. if ($ext !== 'pdf') {
  27. http_response_code(415);
  28. echo 'Only PDF files are accepted';
  29. exit;
  30. }
  31. // Validate metadata
  32. $uuid = preg_replace('/[^a-zA-Z0-9\-]/', '_', $_POST['uuid'] ?? '');
  33. $council_reference = preg_replace('/[^a-zA-Z0-9\-]/', '_', $_POST['council_reference'] ?? '');
  34. if (!$uuid || !$council_reference) {
  35. http_response_code(400);
  36. echo 'Missing UUID or council reference';
  37. exit;
  38. }
  39. // Ensure upload directory exists
  40. $save_dir = UPLOAD_DIR . '/' . $uuid;
  41. if (!is_dir($save_dir)) {
  42. mkdir($save_dir, 0775, true);
  43. }
  44. // Safe filename — never trust the original name
  45. $safe_name = preg_replace('/[^a-zA-Z0-9._-]/', '_', basename($_FILES['pdf']['name']));
  46. $target_path = $save_dir . '/' . $safe_name;
  47. if (move_uploaded_file($_FILES['pdf']['tmp_name'], $target_path)) {
  48. http_response_code(200);
  49. echo 'Uploaded: ' . $safe_name;
  50. } else {
  51. http_response_code(500);
  52. echo 'Failed to save file';
  53. }