PlusMagi's Blog By Pitt Phunsanit Backend,Database curl: ส่งไฟล์

curl: ส่งไฟล์

🚀 คู่มือส่งไฟล์ด้วย CURL: การอัปโหลดข้อมูลแบบ Multipart ใน PostgreSQL

การส่งไฟล์ (File Upload) ผ่าน HTTP Request เป็นหนึ่งในฟังก์ชันพื้นฐานที่นักพัฒนาต้องเจอเสมอ ไม่ว่าจะเป็นการอัปโหลดรูปโปรไฟล์ การส่งเอกสาร หรือการทำ Backup ข้อมูล การใช้เครื่องมืออย่าง `curl` ในการจำลองการส่งไฟล์นี้จึงเป็นทักษะที่สำคัญอย่างยิ่ง

สำหรับผู้ที่ทำงานกับระบบที่ใช้ PostgreSQL เป็น Backend และต้องการส่งไฟล์ข้อมูลจากภายนอก (เช่น จาก Script หรือ API Call) เข้าสู่ระบบอย่างสมบูรณ์ การเข้าใจกลไกการส่งข้อมูลแบบ **`multipart/form-data`** ผ่าน `curl` จึงเป็นสิ่งจำเป็น บทความนี้จะเจาะลึกวิธีการส่งไฟล์อย่างถูกต้องตามหลักการของ HTTP และการเตรียมข้อมูลสำหรับระบบที่ใช้ PostgreSQL เป็นฐานข้อมูลหลัก

💡 หลักการส่งไฟล์ด้วย CURL: Multipart/form-data

เมื่อเราพูดถึงการส่งไฟล์ผ่าน HTTP Request โดยใช้ `curl` เราไม่ได้แค่ส่งข้อมูลข้อความธรรมดา แต่เรากำลังส่งข้อมูลหลายประเภทรวมกัน (เช่น ชื่อผู้ใช้, ข้อความ, และไฟล์ไบนารี) ซึ่งกลไกที่ใช้ในการรวมข้อมูลเหล่านี้คือ **`multipart/form-data`**

การส่งไฟล์ด้วย `curl` จึงต้องมีการกำหนด Header และ Payload ที่ถูกต้อง เพื่อให้เซิร์ฟเวอร์ปลายทาง (ซึ่งอาจจะรันโค้ดที่เชื่อมต่อกับ PostgreSQL) สามารถแยกแยะได้ว่าส่วนไหนคือข้อมูลข้อความ และส่วนไหนคือไฟล์ไบนารี

🛠️ ตัวอย่างการใช้งาน CURL สำหรับส่งไฟล์

ในทางปฏิบัติ เราใช้ `curl` เพื่อจำลองการทำงานของ Browser ที่กำลังอัปโหลดไฟล์ โดยต้องระบุไฟล์ให้เป็น `@` ตามด้วยพาธของไฟล์นั้น ๆ

BASH / Shell

# สมมติว่าเรามีไฟล์ชื่อ 'report.pdf' และต้องการส่งไปที่ API endpoint</code>

<code>curl -X POST 'http://localhost/api/upload_data' \
     -F 'name=Project Alpha' \
     -F 'file=@/path/to/report.pdf' \
     -F 'user_id=1001'</code>

คำอธิบายคำสั่ง:

  • -X POST: กำหนด Method เป็น POST ซึ่งใช้สำหรับการส่งข้อมูลใหม่
  • -F: Flag สำหรับการส่ง Form Data (Field) ซึ่งเป็นหัวใจของการส่งแบบ `multipart/form-data`
  • 'name=Project Alpha': การส่งข้อมูลข้อความธรรมดา
  • 'file=@/path/to/report.pdf': การส่งไฟล์ โดยการใช้ @ นำหน้าพาธไฟล์

⚙️ การจัดการไฟล์ที่ฝั่ง Server (PostgreSQL Context)

เมื่อข้อมูลไฟล์ถูกส่งมาถึงเซิร์ฟเวอร์ (เช่น PHP, Python, หรือ Node.js) สิ่งที่โค้ดฝั่ง Server จะทำคือการรับข้อมูล `multipart/form-data` นี้ และนำไฟล์ที่ได้ไปจัดเก็บในระบบไฟล์ (File System) ก่อน จากนั้นจึงบันทึกข้อมูลที่เกี่ยวข้อง (เช่น ชื่อไฟล์, พาธ, และ Metadata) ลงในตารางของ PostgreSQL

ตัวอย่างการบันทึกข้อมูลใน PostgreSQL:

สมมติว่าเรามีตาราง `attachments` ที่เก็บข้อมูลไฟล์ที่อัปโหลด:

SQL

-- 1. สร้างตารางสำหรับเก็บข้อมูลไฟล์แนบ (Metadata)</code>
CREATE TABLE attachments (
    attachment_id SERIAL PRIMARY KEY,
    user_id INTEGER NOT NULL,
    file_name VARCHAR(255) NOT NULL,
    file_path TEXT NOT NULL,
    uploaded_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

-- 2. ตัวอย่างการบันทึกข้อมูลหลังจากได้รับไฟล์แล้ว (สมมติว่าไฟล์ถูกบันทึกที่ /uploads/)
INSERT INTO attachments (user_id, file_name, file_path) VALUES 
(1001, 'report.pdf', '/uploads/1001/report.pdf');

-- 3. การเรียกดูข้อมูลไฟล์ทั้งหมดของผู้ใช้ 1001
SELECT * FROM attachments WHERE user_id = 1001;

การแยกบทบาทระหว่างการรับไฟล์ (File System) และการจัดเก็บ Metadata (PostgreSQL) เป็นแนวทางปฏิบัติที่ดีที่สุด เพื่อให้ฐานข้อมูลมีความสะอาดและรวดเร็วในการค้นหาข้อมูล

✅ บทสรุป: การเชื่อมโยง CURL และ PostgreSQL

การใช้ `curl` เป็นเพียงเครื่องมือจำลองการส่งข้อมูลจากภายนอก ในขณะที่ PostgreSQL คือระบบที่ทำหน้าที่จัดเก็บและจัดการข้อมูลที่ได้จากการส่งไฟล์นั้น ๆ การเข้าใจกระบวนการ `multipart/form-data` อย่างถ่องแท้ จะช่วยให้คุณสามารถออกแบบ API Endpoint และโค้ด Backend ที่มีความเสถียรและปลอดภัยในการรับไฟล์ข้อมูลทุกรูปแบบได้อย่างสมบูรณ์