1. คำอธิบายสั้น ๆ
ข้อมูลในรูปแบบ multipart จะแยกฟอร์มออกเป็นหลายส่วนแต่ละส่วนที่สอดคล้องกับฟิลด์อินพุต ในฟิลด์อินพุตแบบฟอร์มทั่วไปข้อมูลประเภทข้อความจะถูกวางไว้ในส่วนที่สอดคล้องกัน แต่หากมีการอัปโหลดไฟล์ส่วนที่สอดคล้องกันอาจเป็นไบนารี คล้ายกับสิ่งนี้:
2. กำหนดค่าตัวแยกวิเคราะห์แบบหลายส่วน
แม้ว่าคำขอหลายส่วนอาจดูซับซ้อน แต่ก็เป็นเรื่องง่ายที่จะจัดการกับพวกเขาในฤดูใบไม้ผลิ MVC ก่อนที่จะเขียนเมธอดคอนโทรลเลอร์เพื่อจัดการการอัปโหลดไฟล์เราต้องกำหนดค่าตัวแยกวิเคราะห์แบบหลายส่วนเพื่อบอก DispatchERServlet ว่าจะอ่านคำขอหลายส่วนได้อย่างไร
ฤดูใบไม้ผลิมีการใช้งานสองในตัวของ MultipartResolver:
การกำหนดค่าของ StandardservletMultipartResolver:
1. คำสั่งถั่ว:
การกำหนดค่าใน ApplicationContext.xml
การคัดลอกรหัสมีดังนี้: <bean id = "multipartresolver" Brush: java; "> @bean (name =" MultiPartResolver ") มาตรฐานสาธารณะ ServentervletMultiPartResolver getStandardservletMultipartResolver () {คืนมาตรฐานใหม่
เคล็ดลับ: ชื่อของตัวแยกวิเคราะห์แบบหลายส่วนจะต้องเป็น multipartresolver มิฉะนั้นจะมีการรายงานข้อผิดพลาด
2. กำหนดค่าพารามิเตอร์การอัปโหลด:
* การกำหนดค่า web.xml
<servlet> <servlet-name> dispatcherservlet </servlet-name> <servlet-lass> org.springframework.web.servlet.dispatcherservlet </servlet-lass> <init-param> <load-on-startup> 1 </load-on-startup> <multipart-config> <!-อัปโหลดไปยังไดเรกทอรี/tmp/upload-> <location>/tmp/upload </location> <!-ขนาดไฟล์คือ 2m-> <max-file-size> 2097152 <max-request-Size> 4194304 </max-Request-size> <!-ไฟล์ทั้งหมดจะต้องเขียนลงบนดิสก์-> <ไฟล์ Size-Threshold> 0 </ไฟล์ Size-threshold> </conlet-Ntame> </servlet-mapping>
* การกำหนดค่าในคลาสการกำหนดค่า
สืบทอดมาในคลาสการกำหนดค่าของ AbstractannotationConfigDispatcherservletInitializer
@Override Void Void CustomizeRegistration (ServletRegistration.Dynamic Registration) {// อัปโหลดไปยังไดเรกทอรี /TMP /อัปโหลดขนาดไฟล์คือ 2M คำขอทั้งหมดไม่เกิน 4M และไฟล์ทั้งหมดจะต้องเขียนลงในการลงทะเบียนดิสก์ MultipartConfigelement ("E: // upload_ftp", 2097152,4194304,0)); -การกำหนดค่า CommonsMultipartResolver:
1. ประกาศถั่วและกำหนดค่าพารามิเตอร์การอัปโหลด
<bean id = "MultipartResolver"> <!-ตั้งค่าไดเรกทอรีอัปโหลด/tmp/upload; ความจุไฟล์สูงสุดถูกตั้งค่าเป็น 2m; ขนาดหน่วยความจำสูงสุดถูกตั้งค่าเป็น 0 ซึ่งหมายความว่าไฟล์ทั้งหมดจะถูกเขียนลงในดิสก์ ไม่สามารถตั้งค่าความจุสูงสุดโดยรวมของคำขอ multipart-> <property name = "UploadTempdir" value = "/tmp/upload"/> <property name = "maxuploadsize" value = "2097152"/> <property name = "MaxinMemorySize" value = "0"/>
ความแตกต่าง:
1. Commonsmultipartresolver เมื่อเทียบกับ StandardservletMultipartResolver มันเป็นไปไม่ได้ที่จะตั้งค่าความจุสูงสุดโดยรวมของคำขอหลายส่วน
2. CommonsMultipartResolver ไม่บังคับให้ตั้งค่าเส้นทางไฟล์ชั่วคราว โดยค่าเริ่มต้นเส้นทางนี้เป็นไดเรกทอรีชั่วคราวของคอนเทนเนอร์ servlet StandardservletMultipartResolver ต้องตั้งค่าเส้นทางไฟล์ชั่วคราวเพื่อดำเนินการตามปกติ (ไดเรกทอรีที่อัปโหลดดังกล่าวข้างต้นเป็นเส้นทางไฟล์ชั่วคราวทั้งหมด)
3. SpringMVC จัดการคำขอ
1. ฟอร์มแบบฟอร์มส่วนหน้า
<form action = "/picture" method = "post" enctype = "multipart/form-data"> <input type = "file" name = "picture"> <input type = "ส่ง"> </form>
เคล็ดลับ: enctype = "multipart/form-data" จำเป็นต้องตั้งค่าเพื่อบอก SpringMVC ว่านี่เป็นคำขอหลายส่วน
2. แบ็กเอนด์ MVC ยอมรับคำขอ
@RequestMapping (value = "/picture", method = requestMethod.post) สตริงสาธารณะ gethome (@RequestPart ("รูปภาพ") รูปภาพ MultipartFile) พ่น IOException {string name = picture.getName (); ไบต์ [] bytes = picture.getBytes (); picture.transferto (ไฟล์ใหม่ ("/"+picture.getoriginalfilename ())); // เมื่อบันทึกไปยังระบบไฟล์ที่นี่ให้ใช้เส้นทางสัมพัทธ์ตัวอย่างเช่นการกำหนดค่าที่นี่คือ / ขึ้นอยู่กับไดเรกทอรีการอัปโหลดที่กำหนดค่า นั่นคือพา ธ ไฟล์ e:/ upload_ftp/ เป็นไดเรกทอรีที่บันทึกไว้ "บ้าน"; -เคล็ดลับ: 1. @requestpart ("รูปภาพ"): เมื่อส่งแบบฟอร์มลงทะเบียนแอตทริบิวต์ P Essence จะให้อาร์เรย์ของไบต์ซึ่งมีข้อมูลชิ้นส่วนที่เกี่ยวข้องในคำขอ (ระบุผ่าน @requestpart) หากผู้ใช้ส่งแบบฟอร์มโดยไม่ต้องเลือกไฟล์อาร์เรย์จะว่างเปล่า (แทนที่จะเป็นโมฆะ) ดังนั้นเรายังสามารถใช้อาร์เรย์ BYTE [] เพื่อรับคำขอหลายส่วนแทน MultipartFile
2. MultipartFile: การใช้วิธี MultipartFile เพื่อรับให้เรามีวิธีการมากมายในการทำงานต่อไป ...
3. ยอมรับไฟล์ที่อัปโหลดในรูปแบบของชิ้นส่วน
สำหรับเรื่องนี้มีความแตกต่างระหว่างอินเตอร์เฟสชิ้นส่วนและ MultipartFile ไม่มากนัก ในหลายกรณีชื่อของวิธีการส่วนหนึ่งนั้นเหมือนกับชื่อของวิธีการ MultipartFile มีความคล้ายคลึงกันบางอย่าง แต่แตกต่างกันเล็กน้อยเช่น getSubmittedfilename () ที่สอดคล้องกับ getoriginalfilename () ในทำนองเดียวกันการเขียน () สอดคล้องกับ transferto () และด้วยความช่วยเหลือของวิธีนี้เราสามารถเขียนไฟล์ที่อัปโหลดไปยังระบบไฟล์
เป็นเรื่องที่ควรค่าแก่การกล่าวถึงว่าหากคุณยอมรับการอัปโหลดไฟล์ผ่านพารามิเตอร์ชิ้นส่วนเมื่อเขียนวิธีการควบคุมคอนโทรลเลอร์ก็ไม่จำเป็นต้องตั้งค่า MultipartResolver เฉพาะเมื่อใช้ MultipartFile เราต้องมี Multipartresolver
@RequestMapping (value = "/picture", method = requestMethod.post) สตริงสาธารณะ gethome (@requestpart ("picture") ภาพชิ้นส่วน) โยน ioexception {picture.write ("/"+picture.getsubmittedfilename ()); กลับ "บ้าน"; -ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น