สภาพแวดล้อม: Maven + SpringMvc + Spring + MyBatis + MySQL
บทความนี้ส่วนใหญ่จะอธิบายวิธีการใช้อินพุตเพื่ออัปโหลดไฟล์ไปยังไดเรกทอรีที่ระบุของเซิร์ฟเวอร์หรือบันทึกลงในฐานข้อมูล วิธีดาวน์โหลดไฟล์จากฐานข้อมูลแสดงไฟล์ภาพและบรรลุการปรับขนาด
จัดเก็บไฟล์ในฐานข้อมูลโดยทั่วไปคืออาร์เรย์ไบต์ที่เก็บไฟล์และประเภทข้อมูลฐานข้อมูลที่เกี่ยวข้องคือ BLOB
ก่อนอื่นคุณต้องสร้างฐานข้อมูลที่นี่คุณใช้ฐานข้อมูล MySQL
หมายเหตุ: รหัสที่ให้ไว้ในบทความส่วนใหญ่เป็นข้อความที่ตัดตอนมาและไม่สมบูรณ์
1. การเตรียม
ใช้ Maven เพื่อสร้าง SpringMVC+Spring+MyBatis+MySQL Project
สำหรับวิธีการรวม Spring+MyBatis+MySQL ดูการแนะนำ mybatis และกำหนดค่า mybatis+spring+mysql:
การเรียนรู้ mybatis หนึ่งบทนำและการกำหนดค่าของ mybatis mybatis + spring + mysql
สำหรับการก่อสร้างสภาพแวดล้อม SpringMVC โปรดดู: ใช้ Eclipse เพื่อสร้างโครงการ SpringMVC ของ Maven:
สร้างโครงการ SpringMVC ของ Maven โดยใช้ Eclipse
ใน HTML เบื้องหน้า Enctype ของแบบฟอร์มคือ Multipart/Form-Data โปรดทราบว่าชื่อของอินพุตและเลือกควรสอดคล้องกับสมาชิกใน studentform ทีละคน
URL ที่อัปโหลดคือ addaction.do พารามิเตอร์ของวิธีการดำเนินการนี้ใช้ studentForm เพื่อแมปข้อมูลที่ส่ง ในเวลานี้ข้อมูลของไฟล์ที่ส่งสามารถได้รับ จากนั้นเราทำงานบนไฟล์
สร้างตาราง photo_tbl: ฟิลด์ photo_data ใช้ในการจัดเก็บไฟล์และประเภทคือ mybatis longblob; จากนั้นเขียน photoMapper อินเตอร์เฟส Java ของ Mapper: รวมถึงการเพิ่มการลบการดัดแปลงและการค้นหา ไฟล์ XML ของ Mappper: คำสั่ง SQL ที่สอดคล้องกับอินเตอร์เฟส Java
และไฟล์การกำหนดค่าสปริงจำเป็นต้องเพิ่มการประกาศถั่ว
ด้านล่างนี้เป็นตัวอย่างรหัสของ HTML, Action และ StudentForm; สร้างรหัสอินเตอร์เฟส SQL, photomapper.java และรหัสไฟล์ photomapper.xml ของตาราง photo_tbl
1.1 วิธีการเขียนแบบฟอร์ม HTML
1. <form action = "<c: url value = 'addaction.do'/>" method = "post" enctype = "multipart/form-data"> 2. <plous> 3. <tr> 4. <td Align = "ขวา"> รูปภาพ: </td> 5. <td> <td> 9. </form>
1.2 วิธีการดำเนินการ
1./** 2. * เพิ่ม - ส่ง 3. */ 4.@requestmapping (value = "addaction.do") 5.Public String add_action (ModelMap Model, Form StudentForm) {6. 7. } 1.3 ชั้นเรียนนักศึกษา
1. พัสดุ Liming.student.Manager.web.model; 2. 3.Import org.springframework.web.multipart.multipartfile; 4. 5. PUBLIC LASTRICHFORM Explorm GeneralForm {6. 7. String Private String studentName; 8. Private Int Studentsex; 9. String Private Studentbirthday; 10. นักศึกษาหลายคนส่วนตัว 11. 12. } 1.4 สร้าง photo_tbl
1. สร้างตาราง photo_tbl 2. (3. photo_id varchar (100) คีย์หลัก, 4. photo_data longblob, 5. file_name varchar (10) 6. );
1.5 อินเทอร์เฟซ Photomapper
1.@repository 2.@transactional 3. photoMapper อินเตอร์เฟส {4. 5. โมฆะสาธารณะ createphoto (เอนทิตีแสง); 6. 7. Public Int deletephotobyphotoid (สตริง photoid); 8. 9. INT UPDATEPHOTODATE สาธารณะ (@Param ("photoid") สตริง photoid, @param ("photodate") ไบต์ [] photodate); 10. 11. photoentity photoEntity getphotoentitybyphotoid (สตริง photoid); 12. 13. } 1.6 ไฟล์ photomapper.xml
รวมถึงการลบการดัดแปลงและการค้นหา Photoid ที่เพิ่มเข้ามาใหม่ใช้ฟังก์ชั่น MySQL Custom เพื่อสร้างคีย์หลักโดยอัตโนมัติ เมื่อใช้งาน blobs คุณจะต้องตั้งค่า typeHandler เป็น "org.apache.ibatis.type.blobtypehandler พารามิเตอร์จะต้องระบุในภายหลังเมื่อแทรกและอัปเดตและจำเป็นต้องระบุในผลลัพธ์
1. <? xml เวอร์ชัน = "1.0" การเข้ารหัส = "utf-8"?> 2. <! doctype mapper สาธารณะ "-// mybatis.org//dtd mapper 3.0 // en" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" namespace = "liming.student.manager.data.photomapper"> 4. <resultmap type = "liming.student.manager.data.model.photoentity" id = "photomapper_resultmap_photoentity"> 5 jdbcType = "varchar" /> 6. <คุณสมบัติผลลัพธ์ = "photoData" คอลัมน์ = "photo_data" javatype = "byte []" jdbctype = "blob" typeHandler = "org.apache.ibatis.type.blobtypehandler" /> jdbcType = "varchar"/> 8. </resultmap> 9. 10. <แทรก id = "createphoto" parameterType = "liming.student.manager.data.model.photoentity"> selectv keykkey = "photoid" แทรกลงใน photo_tbl (photo_id, 15. photo_data, 16. file_name) 17. ค่า ( #{photoid, jdbctype = varchar}, 18. #{photodata, javatype = byte [] #{filename, jdbcType = varchar}) 20. </insert> 21. 22. <ลบ id = "deletephotobyphotoid"> 23. ลบจาก photo_tbl 24 photo_data = #{photodata, javatype = byte [], jdbctype = blob, typeHandler = org.apache.ibatis.type.blobtypehandler}, 30. file_name = #{filename </update> 33. 34. <select id = "getphotoentitybyphotoid" resultmap = "photomapper_resultmap_photoentity"> 35. เลือก photo_id, 36. photo_data, 37. file_name 38. จาก photo_tbl 39 41. </Mapper> 1.7 ไฟล์การกำหนดค่าสปริง
ไฟล์การกำหนดค่าสปริงจำเป็นต้องเพิ่มการประกาศของ org.springframework.web.multipart.commons.commonsmontipartresolver
1. <bean id = "multipartresolver"> 2. <property name = "MaxUploadSize" value = "1073741824" /> 3. </ebean>
2. ใส่ไฟล์บนเซิร์ฟเวอร์
1. สตริงสุดท้ายคงที่ uploadFilePath = "d: // temp_upload_file //"; 2. 3./** 4. * ใหม่ - ส่งเฉพาะบันทึกไฟล์ไปยังเซิร์ฟเวอร์ 5. */ 6.@requestmapping (value = "addaction.do") 7.Public String add_Action (ModelMap Model, รูปแบบ studentform) {8.try {9. MultipartFile UploadFile = form.getStudentPhoto (); 10. ชื่อไฟล์สตริง = uploadfile.getoriginalfilename (); 11. inputStream คือ = uploadfile.getInputStream (); 12. // หากเซิร์ฟเวอร์มีไฟล์ที่มีชื่อเดียวกับไฟล์อัปโหลดข้อความพรอมต์คือเอาต์พุต 13. ไฟล์ tempfile = ไฟล์ใหม่ (uploadFilePath + ชื่อไฟล์); 14. ถ้า (tempfile.exists ()) {15. บูลีน delresult = tempfile.delete (); 16. System.out.println ("ลบไฟล์ที่มีอยู่:" + delresult); 17. } 18. // เริ่มบันทึกไฟล์ไปยังเซิร์ฟเวอร์ 19. ถ้า (! filename.equals ("")) {20. FileOutputStream fos = ใหม่ fileOutputStream (uploadFilePath + ชื่อไฟล์); 21. byte [] buffer = byte ใหม่ [8192]; // อ่าน 8K ไบต์ในแต่ละครั้ง 22. จำนวน int = 0; 23. // เริ่มอ่านไบต์ของไฟล์ที่อัปโหลดและส่งออกไปยังสตรีมเอาต์พุตเซิร์ฟเวอร์ที่อัพโหลดไฟล์ 24. ในขณะที่ ((count = is.read (บัฟเฟอร์))> 0) {25. fos.write (บัฟเฟอร์, 0, นับ); // เขียนสตรีมไบต์ไปยังไฟล์เซิร์ฟเวอร์ 26. } 27. fos.close (); // ปิดวัตถุ FileOutputStream 28. is.close (); // วัตถุอินพุทสตรีม 29.} 30.} catch (filenotfoundException e) {31. E.printStackTrace (); 32. } catch (ioexception e) {33. e.printstacktrace (); 34.} 35. } 3. อัปโหลดไฟล์ไปยังฐานข้อมูล
1./** 2. * ใหม่ - ส่งและบันทึกไฟล์ไปยังฐานข้อมูล 3. */ 4.@requestmapping (value = "addaction.do") 5.Public String add_Action (ModelMap Model, Form StudentForm) {6. inputStream คือ = form.getStudentPhoto () getInputStream (); 7. byte [] studentphotodata = byte ใหม่ [(int) form.getStudentPhoto (). getSize ()]; 8. IS.READ (StudentPhotodata); 9. ชื่อสตริง filename = form.getStudentPhoto (). getoriginalfilename (); 10. photoEntity photoEntity = new photoEntity (); 11. photoEntity.setphotodata (StudentPhotodata); 12. photoEntity.setFilename (ชื่อไฟล์); 13. this.photomapper.createphoto (photoEntity); 14. } 4. ดาวน์โหลดไฟล์
ในการดาวน์โหลดไฟล์คุณต้องกู้คืนอาร์เรย์ไบต์ไปยังไฟล์
ก่อนอื่นให้ใช้ mybatis เพื่อค้นหาอาร์เรย์ไบต์ในฐานข้อมูลและระบุชื่อไฟล์ (รวมถึงรูปแบบ) จากนั้นใช้ OutputStream เพื่อป้อนไฟล์
1.@requestmapping (value = "downphotobyId") 2. public เป็นโมฆะ downphotobystudentId (string id, การตอบกลับ httpservletResponse สุดท้าย) {3. entity photoEntity = this.photomapper.getPhotoentityByPhotoid (id); 4. byte [] data = entity.getphotodata (); 5. ชื่อสตริง filename = entity.getFileName () == null? "photo.png": entity.getFilename (); 6. filename = urlencoder.encode (ชื่อไฟล์, "UTF-8"); 7. Response.reset (); 8. Response.SetheAder ("เนื้อหา-การจัดสรร", "เอกสารแนบ; ชื่อไฟล์ =/" " + ชื่อไฟล์ +"/""); 9. Response.addheader ("ความยาวเนื้อหา", "" + data.length); 10. Response.SetContentType ("Application/Octet-Stream; Charset = UTF-8"); 11. OutputStream OutputStream = ใหม่ bufferedOutputStream (response.getOutputStream ()); 12. OutputStream.Write (ข้อมูล); 13. OutputStream.flush (); 14. outputstream.close (); 15. }<a href = "< %= request.getContextPath () %>/downphotobyId.do?id=8000001"> รูปถ่ายโหลดลง </a>
5. แสดงไฟล์อิมเมจไบต์
1.@requestmapping (value = "getphotobyId") 2. public void getphotobyId (รหัสสตริง, การตอบกลับ httpservletResponse สุดท้าย) {3. เอนทิตีของ PhotoEntity = this.photomapper.getPhotoentityByPhotoid (ID); 4. byte [] data = entity.getphotodata (); 5. Response.SetContentType ("Image/JPEG"); 6. การตอบสนอง Setcharacterencoding ("UTF-8"); 7. OutputStream outputSream = Response.TOTOUTPUTSTREAM (); 8. inputStream ใน = new ByteArrayInputStream (ข้อมูล); 9. int len = 0; 10. ไบต์ [] buf = ไบต์ใหม่ [1024]; 11. ในขณะที่ ((len = in.read (buf, 0, 1024))! = -1) {12. outputSream.write (buf, 0, len); 13. } 14. outputSream.close (); 15. }<img src = "< %= request.getContextPath () %>/getphotobyid.do?id=8000001"/>
6. สเกลรูปภาพตามความยาวและความกว้างเท่ากันสัดส่วน
1.@requestmapping (value = "getphotoid") 2. public void getphotobyId (รหัสสตริง, ความกว้าง int, ความสูง int, การตอบสนอง httpservletResponse สุดท้าย) {3. เอนทิตีโฟโตอิเทนต์ = this.photomapper.getPhotoentityByPhotoid (id); 4. byte [] data = entity.getphotodata (); 5. ถ้า (ความกว้าง! = 0 && ความสูง! = 0) {6. data = scaleImage (ข้อมูล, ความกว้าง, ความสูง); 7. } 8. Response.SetContentType ("Image/JPEG"); 9. Response.Setcharacterencoding ("UTF-8"); 10. OutputStream outputSream = Response.TOTOUTPUTSTREAM (); 11. inputStream ใน = new ByteArrayInputStream (ข้อมูล); 12. int len = 0; 13. ไบต์ [] buf = ไบต์ใหม่ [1024]; 14. ในขณะที่ ((len = in.read (buf, 0, 1024))! = -1) {15. outputSream.write (buf, 0, len); 16. } 17. outputSream.close (); 18. } 19. 20. Public Static Byte [] ScaleImage (BYTE [] ข้อมูล, ความกว้าง int, ความสูง int) พ่น IOException {21. bufferedImage buffered_oldimage = imageio.read 22. int imageoldWidth = buffered_oldimage.getWidth (); 23. int imageoldheight = buffered_oldimage.getheight (); 24. double scale_x = (double) ความกว้าง / imageoldWidth; 25. double scale_y = (double) ความสูง / imageoldheight; 26. double scale_xy = math.min (scale_x, scale_y); 27. int imageNewWidth = (int) (imageoldWidth * scale_xy); 28. int imageNewHeight = (int) (imageoldheight * scale_xy); 29. bufferedImage buffered_newimage = new bufferedImage (imageNewwidth, imageNewHeight, bufferedImage.type_int_rgb); 30. buffered_newimage.getGraphics (). drawImage (buffered_oldimage.getScaledInstance (imageNewwidth, imageNewheight, bufferedimage.scale_smooth), 0, 0, null); 31. buffered_newimage.getGraphics (). กำจัด (); 32. byteArrayOutputStream outputStream = ใหม่ byteArrayOutputStream (); 33. imageio.write (buffered_newimage, "jpeg", outputstream); 34. return outputstream.tobytearray (); 35. }<img src = "< %= request.getContextPath () %>/getPhotobyId.do?id=8000001&width=300&height=300"/> >>
ด้านบนคือการรวมกันของ MyBatis และ SpringMVC เพื่อใช้ฟังก์ชั่นการอัปโหลดและดาวน์โหลดไฟล์ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากคุณมีคำถามใด ๆ โปรดฝากข้อความถึงฉันและบรรณาธิการจะตอบกลับทุกคนในเวลา ขอบคุณมากสำหรับการสนับสนุนเว็บไซต์ Wulin.com!