העלאת קבצים עם אביב MVC

1. סקירה כללית

במאמרים קודמים הצגנו את יסודות הטיפול בטפסים וחקרנו את ספריית תגי הטופס באביב MVC.

במאמר זה אנו מתמקדים במה שאביב מציע תמיכה מרובת חלקים (העלאת קבצים) ביישומי רשת.

האביב מאפשר לנו לאפשר תמיכה מרובת חלקים זו עם תקע ריבוי פתרונות חפצים. המסגרת מספקת אחת ריבוי פתרונות יישום לשימוש עם Commons FileUpload ועוד לשימוש עם סרוולט 3.0 ניתוח בקשות מרובות חלקים.

לאחר הגדרת התצורה של ריבוי פתרונות נראה כיצד להעלות קובץ יחיד ומספר קבצים.

ניגע גם מגף אביב.

2. Commons FileUpload

להשתמש CommonsMultipartResolver כדי לטפל בהעלאת הקובץ, עלינו להוסיף את התלות הבאה:

 commons-fileupload commons-fileupload 1.3.1 

עכשיו נוכל להגדיר את CommonsMultipartResolver שעועית לתצורת האביב שלנו.

זֶה ריבוי פתרונות מגיע עם סדרה של מַעֲרֶכֶת שיטה להגדרת מאפיינים כגון הגודל המרבי להעלאות:

@Bean (name = "multipartResolver") ציבור CommonsMultipartResolver multipartResolver () {CommonsMultipartResolver multipartResolver = CommonsMultipartResolver חדש (); multipartResolver.setMaxUploadSize (100000); להחזיר ריבוי חלקים; }

כאן עלינו לשלוט בתכונות שונות של CommonsMultipartResolver בהגדרת שעועית עצמה.

3. עם סרוולט 3.0

על מנת להשתמש סרוולט 3.0 ניתוח חלקים מרובים, עלינו להגדיר כמה חלקים מהיישום. ראשית, עלינו להגדיר א MultipartConfigElement בשלנו DispatcherServletהַרשָׁמָה:

מחלקה ציבורית MainWebAppInitializer מיישם את WebApplicationInitializer {private String TMP_FOLDER = "/ tmp"; פרטי int MAX_UPLOAD_SIZE = 5 * 1024 * 1024; @ ביטול ציבורי בטל ב- OnStartup (ServletContext sc) זורק ServletException {ServletRegistration.Dynamic appServlet = sc.addServlet ("mvc", DispatcherServlet חדש (GenericWebApplicationContext חדש))); appServlet.setLoadOnStartup (1); MultipartConfigElement multipartConfigElement = MultipartConfigElement חדש (TMP_FOLDER, MAX_UPLOAD_SIZE, MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2); appServlet.setMultipartConfig (multipartConfigElement); }}

בתוך ה MultipartConfigElement אובייקט, הגדרנו את מיקום האחסון, גודל הקובץ האישי המרבי, גודל הבקשה המקסימלי (במקרה של מספר קבצים בבקשה אחת), והגודל בו נזרקת התקדמות העלאת הקובץ למיקום האחסון.

יש להחיל הגדרות אלה ברמת רישום השרת סרוולט 3.0 אינו מאפשר להם להירשם ב- ריבוי פתרונות כמו שקורה עם CommonsMultipartResolver.

ברגע שזה נעשה, אנחנו יכולים להוסיף את StandardServletMultipartResolver לתצורת האביב שלנו:

@Bean StandardServletMultipartResolver multipartResolver () {להחזיר StandardServletMultipartResolver חדש (); }

4. העלאת קובץ

כדי להעלות את הקובץ שלנו, נוכל לבנות טופס פשוט שבו אנו משתמשים ב- HTML קֶלֶט תייג עם סוג = 'קובץ'.

ללא קשר לתצורת הטיפול בהעלאה, בחרנו, עלינו להגדיר את תכונת הקידוד של הטופס ל נתונים מרובי חלקים / טפסים. זה מאפשר לדפדפן לדעת לקודד את הטופס:

בחר קובץ להעלאה

כדי לאחסן את הקובץ שהועלה נוכל להשתמש ב- MultipartFile מִשְׁתַנֶה. אנו יכולים לאחזר משתנה זה מפרמטר הבקשה בשיטת הבקר שלנו:

@RequestMapping (value = "/ uploadFile", method = RequestMethod.POST) ציבורי מחרוזת להגיש (@RequestParam ("file") קובץ MultipartFile, ModelMap modelMap) {modelMap.addAttribute ("קובץ", קובץ); להחזיר "fileUploadView"; } 

ה MultipartFile class מספק גישה לפרטים אודות הקובץ שהועלה, כולל שם קובץ, סוג קובץ וכן הלאה. אנו יכולים להשתמש בדף HTML פשוט כדי להציג מידע זה:

קובץ שהוגש

OriginalFileName:$ {file.originalFilename}
סוּג:$ {file.contentType}

5. העלאה מספר קבצים

כדי להעלות מספר קבצים בבקשה אחת, אנו פשוט שמים מספר שדות קובצי קלט בתוך הטופס:

בחר קובץ להעלאה
בחר קובץ להעלאה
בחר קובץ להעלאה

עלינו לדאוג שלכל שדה קלט יהיה אותו שם, כך שניתן יהיה לגשת אליו כמערך של MultipartFile:

@RequestMapping (value = "/ uploadMultiFile", method = RequestMethod.POST) public String submit (@RequestParam ("files") MultipartFile [] files, ModelMap modelMap) {modelMap.addAttribute ("קבצים", קבצים); להחזיר "fileUploadView"; } 

כעת, אנו יכולים פשוט לחזור על מערך זה כדי להציג מידע על קבצים:

   העלאת קובץ MVC באביב 

קבצים שהוגשו

OriginalFileName:$ {file.originalFilename}
סוּג:$ {file.contentType}

6. העלאת קבצים עם נתוני טופס נוספים

אנו יכולים גם לשלוח מידע נוסף לשרת יחד עם הקובץ המועלה. עלינו לכלול את השדות הנדרשים בטופס:

שֵׁם
אימייל
בחר קובץ להעלאה

בבקר אנו יכולים לקבל את כל נתוני הטופס באמצעות ה- @RequestParam ביאור:

@PostMapping ("/ uploadFileWithAddtionalData") מחרוזת ציבורית מוגשת (@RequestParam MultipartFile קובץ, @RequestParam שם מחרוזת, @RequestParam מחרוזת דוא"ל, ModelMap modelMap) {modelMap.addAttribute ("שם", שם); modelMap.addAttribute ("דוא"ל", דוא"ל); modelMap.addAttribute ("קובץ", קובץ); להחזיר "fileUploadView"; }

בדומה לסעיפים הקודמים, אנו יכולים להשתמש בדף ה- HTML עם JSTL תגים להצגת המידע.

אנו יכולים גם לתמצת את כל שדות הטופס בכיתת מודל ולהשתמש בהם @ModelAttribute ביאור בבקר. זה יעיל כשיש הרבה שדות נוספים יחד עם הקובץ. בואו נסתכל על הקוד:

מחלקה ציבורית FormDataWithFile {שם מחרוזת פרטי; דוא"ל מחרוזת פרטי; קובץ פרטי מרובה חלקים; // סטרים וקובעים סטנדרטיים}
@PostMapping ("/ uploadFileModelAttribute") מחרוזת ציבורית להגיש (@ModelAttribute FormDataWithFile formDataWithFile, ModelMap modelMap) {modelMap.addAttribute ("formDataWithFile", formDataWithFile); להחזיר "fileUploadView"; }

7. העלאת קובץ אתחול האביב

אם אנו משתמשים באביב מגף, כל מה שראינו עד כה עדיין תקף.

עם זאת, Spring Boot מקל עוד יותר על התצורה וההתחלה של הכל בטרחה קטנה.

באופן מיוחד, אין צורך להגדיר שום סרוולט, כמו Boot יירשם ויגדיר זאת עבורנו, בתנאי שנכלול את מודול האינטרנט בתלות שלנו:

 org.springframework.boot spring-boot-starter-web 2.1.8.RELEASE 

אנו יכולים למצוא את הגרסה האחרונה של קפיץ-אתחול-רשת במרכז מייבן.

אם אנו רוצים לשלוט בגודל המקסימלי להעלאת קבצים, נוכל לערוך את application.properties:

spring.servlet.multipart.max-file-size = 128KB spring.servlet.multipart.max-size-request = 128KB

אנו יכולים גם לשלוט אם העלאת קבצים מופעלת, והמיקום להעלאת קבצים:

spring.servlet.multipart.enabled = spring.servlet.multipart.location אמיתי = $ {java.io.tmpdir}

שים לב שהשתמשנו $ {java.io.tmpdir} כדי להגדיר את מיקום ההעלאה כך שנוכל להשתמש במיקום הזמני עבור מערכות הפעלה שונות.

8. מסקנה

במאמר זה בדקנו דרכים שונות להגדיר תמיכה מרובת חלקים באביב. באמצעות אלה אנו יכולים לתמוך בהעלאות קבצים ביישומי האינטרנט שלנו.

את יישום הדרכה זו ניתן למצוא בפרויקט GitHub. כאשר הפרויקט פועל באופן מקומי, ניתן לגשת לדוגמת הטופס בכתובת // localhost: 8080 / spring-mvc-java / fileUpload