ข้ามไปเนื้อหาหลัก

เจาะลึก Solon File Upload ใช้ UploadedFile จัดการไฟล์แทน MultipartFile

ทำความเข้าใจระบบอัปโหลดไฟล์ในเฟรมเวิร์ก Solon ที่เน้นความโปร่งใส ควบคุมการทำงานได้ชัดเจนโดยไม่ต้องพึ่งพาการตั้งค่าอัตโนมัติจำนวนมาก

เรียบเรียงโดย AI
Inewgen
31 Jul 2026ที่มา: Dev.to3 นาทีอ่าน (0 ครั้ง)อัปเดตล่าสุด 01 Aug 2026
แชร์
เจาะลึก Solon File Upload ใช้ UploadedFile จัดการไฟล์แทน MultipartFile

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

ขนาดตัวอักษร
  • Solon ใช้คลาส UploadedFile จัดการไฟล์ในเลเยอร์เว็บโดยไม่ต้องตั้งค่าเพิ่ม
  • เฟรมเวิร์กจะไม่ลบไฟล์ชั่วคราวให้อัตโนมัติ จึงต้องใช้รูปแบบ try/finally เสมอ
  • รองรับการส่งหลายไฟล์พร้อมกันด้วย UploadedFile[] ตั้งแต่เวอร์ชัน v2.3.8 เป็นต้นไป
  • ตั้งค่าขนาดไฟล์และหน่วยความจำได้ผ่านไฟล์ app.yml เช่น การกำหนดค่า fileSizeThreshold ใน v3.6.0

การอัปโหลดไฟล์มักจะเป็นเรื่องน่าเบื่อจนกว่าคุณจะเคยใช้เวลาช่วงบ่ายเพื่อแก้ปัญหาข้อผิดพลาดประเภท MultipartException: Failed to parse multipart servlet request ในสภาพแวดล้อมจริงบนเซิร์ฟเวอร์โปรดักชัน ซึ่งในฝั่งของ Spring Boot การอัปโหลดไฟล์จะต้องเกี่ยวข้องกับคอมโพเนนต์อย่าง MultipartFile, MultipartAutoConfiguration, ชุดคุณสมบัติ spring.servlet.multipart.* รวมถึงการตั้งต้นสมมติฐานว่าแอปพลิเคชันกำลังทำงานบนเซิร์ฟเวิร์ตคอนเทนเนอร์ แม้ว่าระบบเหล่านี้จะใช้งานได้จริง แต่ก็ซ่อนกลไกการทำงานเบื้องหลังไว้ค่อนข้างมาก

ในทางตรงกันข้าม เฟรมเวิร์ก Solon เลือกเส้นทางที่แตกต่างออกไปโดยสิ้นเชิง โดยมีคลาสหลักคือ UploadedFile ซึ่งอยู่ในเว็บเลเยอร์และไม่ต้องอาศัยการตั้งค่าเพิ่มเติมใดๆ ผู้พัฒนาจึงมีอำนาจควบคุมที่ชัดเจนว่ากระบวนการแยกส่วนข้อมูลหรือ multipart parsing จะเกิดขึ้นเมื่อใด และไฟล์ชั่วคราวจะถูกลบออกเมื่อไร

software architecture diagram

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง

เมื่อเมธอดในคอนโทรลเลอร์มีพารามิเตอร์ที่เป็น UploadedFile ระบบของ Solon จะทำการทริกเกอร์กระบวนการแยกส่วนข้อมูลแบบอัตโนมัติทันทีโดยไม่ต้องใส่แอนโนเทชันเพิ่มเติมใดๆ ตัวอย่างเช่นการจัดการฟิลด์ฟอร์ม user_avatar ดังนี้:

  • รองรับฟิลด์เดี่ยว: @Param("user_avatar") UploadedFile file
  • รองรับไฟล์หลายไฟล์: ใช้ UploadedFile[] เมื่อไคลเอนต์ส่งไฟล์หลายไฟล์ภายใต้ชื่อฟิลด์เดียวกัน (รองรับตั้งแต่ v2.3.8)
  • รองรับฟอร์มแบบผสม: สามารถรับทั้งไฟล์และฟิลด์ข้อความธรรมดาได้ในคำขอเดียวกัน

อย่างไรก็ตาม มีข้อควรระวังที่สำคัญคือ เฟรมเวิร์กจะไม่ลบไฟล์ชั่วคราวให้อัตโนมัติ หากคุณข้ามการเรียกใช้งานเมธอด delete() ไฟล์ชั่วคราวเหล่านั้นจะยังคงค้างอยู่บนดิสก์ ดังนั้นรูปแบบการเขียนโค้ดแบบ try/finally จึงเป็นสิ่งจำเป็นที่ไม่สามารถละเลยได้

ไม่อยากพลาดข่าวใหม่?

สมัครรับสรุปข่าวสารใหม่ทางอีเมล ไม่บ่อยจนรำคาญ

โฆษณา

การที่เฟรมเวิร์กไม่ลบไฟล์ชั่วคราวให้อัตโนมัติและกำหนดให้ผู้พัฒนาต้องจัดการผ่าน try/finally นั้น เป็นการออกแบบที่เน้นความโปร่งใสและการควบคุมทรัพยากรระบบด้วยตนเอง ซึ่งช่วยลดความประหลาดใจเมื่อเกิดปัญหาเรื่องพื้นที่ดิสก์เต็มในระบบโปรดักชัน ต่างจากเฟรมเวิร์กบางตัวที่ซ่อนกระบวนการเหล่านี้ไว้เบื้องหลังจนกว่าจะเกิดข้อผิดพลาด

สำหรับการจัดการไฟล์ขนาดใหญ่และหน่วยความจำ Solon อนุญาตให้ปรับแต่งผ่านไฟล์ app.yml ได้อย่างยืดหยุ่น ดังนี้:

  • server.request.maxBodySize: กำหนดขนาดร่างกายของคำขอสูงสุด (ค่าเริ่มต้นคือ 2mb)
  • server.request.maxFileSize: กำหนดขนาดสูงสุดของไฟล์เดี่ยว (ค่าเริ่มต้นคือ 20mb)
  • server.request.maxHeaderSize: กำหนดขนาดส่วนหัวสูงสุด (ค่าเริ่มต้นคือ 8kb)
  • server.request.fileSizeThreshold: กำหนดเกณฑ์ขนาดไฟล์ ถ้าน้อยกว่านี้จะเก็บไว้ในหน่วยความจำ แต่ถ้ามากกว่าจะเก็บเป็นไฟล์ชั่วคราวบนดิสก์ (เพิ่งเพิ่มเข้ามาใน v3.6.0)

การตั้งค่า fileSizeThreshold ที่เปิดตัวในเวอร์ชัน v3.6.0 ช่วยให้ระบบสามารถคัดแยกไฟล์ขนาดเล็กให้อยู่ในหน่วยความจำและไฟล์ขนาดใหญ่ให้ลงดิสก์ได้โดยอัตโนมัติ โดยก่อนหน้านี้ในเวอร์ชันที่เก่ากว่า v3.6.0 คุณจะต้องใช้แฟล็ก use_tempfile: true เพื่อบังคับโหมดไฟล์ชั่วคราว ซึ่งในปัจจุบันแฟล็กดังกล่าวถูกประกาศให้เลิกใช้งานแล้ว

ที่มา: Dev.to

ความคิดเห็น

แสดงความคิดเห็น
0/2000

พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้