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

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- 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 จะเกิดขึ้นเมื่อใด และไฟล์ชั่วคราวจะถูกลบออกเมื่อไร

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
เมื่อเมธอดในคอนโทรลเลอร์มีพารามิเตอร์ที่เป็น 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
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น