PlusMagi's Blog By Pitt Phunsanit Backend PHP: การอัพโหลดไฟล์

PHP: การอัพโหลดไฟล์

ในฐานะ System Specialist และ Senior Database Architect การจัดการไฟล์ที่ถูกอัพโหลด (File Upload Handling) เป็นกระบวนการที่ต้องอาศัยความเข้าใจทั้งระดับแอปพลิเคชัน (เช่น PHP) และระดับโครงสร้างข้อมูล (Database Schema) แม้ว่าตัวกลไกการรับและย้ายไฟล์จะเกิดขึ้นในชั้นของ Web Server หรือภาษา Scripting แต่ฐานข้อมูลอย่าง PostgreSQL มีบทบาทสำคัญในการจัดเก็บ Metadata, การตรวจสอบความสมบูรณ์ของข้อมูล, และการจัดการเส้นทาง (Path Management) ของไฟล์เหล่านั้น

แนวคิดการจัดการ Metadata ไฟล์ที่อัพโหลดด้วย PostgreSQL

เมื่อมีการอัพโหลดไฟล์ผ่าน PHP หรือภาษาอื่น ๆ ข้อมูลสำคัญ เช่น ชื่อต้นฉบับ ขนาดไฟล์ ประเภท MIME และสถานะความผิดพลาด จะถูกส่งมายังระบบ ในมุมมองของฐานข้อมูล เราไม่ได้สนใจแค่ตัวไฟล์ แต่เราสนใจ ชุดข้อมูล (Metadata) ที่บ่งบอกถึงไฟล์นั้นๆ เพื่อให้สามารถเรียกใช้หรือตรวจสอบย้อนหลังได้ การออกแบบ Schema จึงต้องรองรับการจัดเก็บข้อมูลที่ซับซ้อนเหล่านี้

1. การสร้างตารางเพื่อบันทึก Metadata

เราควรใช้ประเภทข้อมูล JSONB ใน PostgreSQL เพื่อความยืดหยุ่นในการจัดเก็บ metadata ที่มาจากแหล่งภายนอก (เช่น PHP’s $_FILES) ซึ่งช่วยให้เราสามารถขยายฟิลด์ข้อมูลได้โดยไม่จำเป็นต้องแก้ไข Schema หลักเสมอไป

SQL

CREATE TABLE uploaded_files ({-
  file_id SERIAL PRIMARY KEY,
  original_name VARCHAR(255) NOT NULL,
  mime_type VARCHAR(100),
  file_size BIGINT,
  storage_path TEXT NOT NULL, -- เส้นทางจริงที่ไฟล์ถูกย้ายไป
  metadata JSONB,
  uploaded_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);

2. การบันทึกข้อมูล Metadata ด้วย PostgreSQL

สมมติว่า PHP ได้ทำการตรวจสอบและย้ายไฟล์ชั่วคราวไปยังตำแหน่งที่ปลอดภัยแล้ว และส่ง metadata มาให้เรา เราสามารถใช้คำสั่ง INSERT เพื่อจัดเก็บข้อมูลเหล่านี้ได้อย่างมีประสิทธิภาพ โดยการใช้ JSONB จะช่วยให้เราจำลองโครงสร้างของตัวแปรหลายตัว (เช่น tmp_name, name, size) เข้าไปในฐานข้อมูลได้

SQL

-- ตัวอย่างการบันทึก metadata ของไฟล์ที่ถูกอัพโหลดสำเร็จแล้ว
INSERT INTO uploaded_files (original_name, mime_type, file_size, storage_path, metadata) VALUES (
  'report.pdf', 
  'application/pdf', 
  102400,
  '/var/www/uploads/unique_uuid_file.pdf',
  jsonb '{"source_system": "php_upload", "temp_status": "success"}'
);

3. การตรวจสอบความถูกต้องของไฟล์ (Validation)

ในระดับฐานข้อมูล เราสามารถใช้ฟังก์ชันขั้นสูงเพื่อจำลองการตรวจสอบความสมบูรณ์ของข้อมูลได้ เช่น การใช้ jsonb_extract_path เพื่อดึงค่าเฉพาะ หรือการใช้ Common Table Expressions (CTE) ในการประมวลผลชุดข้อมูลขนาดใหญ่

SQL

-- ตัวอย่าง: ค้นหาไฟล์ทั้งหมดที่ถูกอัพโหลดในเดือนนี้และมี MIME type เป็นรูปภาพ
WITH recent_uploads AS (
  SELECT 
    file_id, 
    original_name, 
    metadata->>'mime_type' AS mime_type,
    file_size
  FROM uploaded_files
  WHERE uploaded_at >= (CURRENT_DATE - INTERVAL '1 month')
) 
SELECT * FROM recent_uploads WHERE mime_type LIKE 'image/%';

บทสรุปและข้อสังเกต

การอัพโหลดไฟล์เป็นกระบวนการที่ต้องมีการทำงานร่วมกันระหว่างหลายส่วน (PHP/Web Server -> File System -> PostgreSQL) ในฐานะ Database Architect สิ่งที่เราเน้นย้ำคือ ความมั่นคงของข้อมูล และ ความสามารถในการตรวจสอบย้อนหลัง การใช้ JSONB ช่วยให้ระบบมีความยืดหยุ่นสูงในการรับ metadata ที่เปลี่ยนแปลงไปตามเวอร์ชันของแอปพลิเคชัน PHP ขณะที่การใช้ SQL Query ขั้นสูงช่วยให้เราสามารถจัดการและวิเคราะห์ไฟล์เหล่านั้นได้อย่างมีประสิทธิภาพโดยไม่จำเป็นต้องเขียนโค้ดภาษาโปรแกรมใหม่ทุกครั้ง

Exit mobile version