העלאת קבצים באמצעות Servlets ו- JSP

1. הקדמה

במדריך מהיר זה נראה כיצד להעלות קובץ מ- servlet.

כדי להשיג זאת, ראשית נראה את פתרון הווניל ג'קרטה EE עם יכולות העלאת קבצים המסופקות על ידי הילידים @MultipartConfig ביאור.

לאחר מכן, נעבור על אפאצ'י קומונס העלאת קובץ ספרייה, עבור גרסאות קודמות של ה- API של Servlet.

2. שימוש בג'קרטה EE @MultipartConfig

לג'קרטה EE יש את היכולת לתמוך בהעלאות מרובות חלקים מהקופסה.

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

ראשית, בואו נוסיף טופס לקובץ ה- HTML שלנו:

 בחר קובץ: 

יש להגדיר את הטופס באמצעות enctype = ”multipart / data-form” תכונה לאותת העלאה מרובת חלקים.

הַבָּא, נרצה להעלות הערות על שלנו HttpServlet עם המידע הנכון באמצעות @MultipartConfig ביאור:

@MultipartConfig (fileSizeThreshold = 1024 * 1024, maxFileSize = 1024 * 1024 * 5, maxRequestSize = 1024 * 1024 * 5 * 5) Class public MultipartServlet מרחיב את HttpServlet {// ...} 

לאחר מכן, בואו ודא שתיקיית העלאת השרת המוגדרת כברירת מחדל מוגדרת:

מחרוזת uploadPath = getServletContext (). GetRealPath ("") + File.separator + UPLOAD_DIRECTORY; קובץ uploadDir = קובץ חדש (uploadPath); אם (! uploadDir.exists ()) uploadDir.mkdir (); 

סוף כל סוף, אנחנו יכולים לאחזר בקלות את הכניסה שלנו קוֹבֶץ מ ה בַּקָשָׁה משתמש ב getParts () שיטהושמור אותו בדיסק:

עבור (Part part: request.getParts ()) {fileName = getFileName (part); part.write (uploadPath + File.separator + fileName); } 

שים לב שבדוגמה זו אנו משתמשים בשיטת עוזר getFileName ():

פרטי מחרוזת getFileName (Part part) {for (String content: part.getHeader ("content-disposition"). split (";")) {if (content.trim (). startsWith ("שם קובץ")) להחזיר תוכן. substring (content.indexOf ("=") + 2, content.length () - 1); } להחזיר קבועים.DEFAULT_FILENAME; }

לסרוול 3.1. לחלופין נוכל להשתמש ב Part.getSubmittedFileName () שיטה:

fileName = part.getSubmittedFileName ();

3. שימוש בהעלאת קבצים של Apache Commons

אם איננו בפרויקט Servlet 3.0, אנו יכולים להשתמש ישירות בספריית Apache Commons FileUpload.

3.1. להכין

אנו נרצה להשתמש בדברים הבאים pom.xml תלות בכדי להפעיל את הדוגמה שלנו:

 commons-fileupload commons-fileupload 1.3.3 commons-io commons-io 2.6 

ניתן למצוא את הגרסאות האחרונות עם חיפוש מהיר במאגר המרכזי של Maven: commons-fileupload ו- commons-io.

3.2. העלה סרוולט

שלושת החלקים העיקריים לשילוב של אפאצ'י העלאת קובץ הספרייה עוברת כדלקמן:

  • טופס העלאה בא .jsp עמוד.
  • הגדרת התצורה שלך DiskFileItemFactory ו ServletFileUpload לְהִתְנַגֵד.
  • עיבוד התוכן בפועל של העלאת קובץ מרובה חלקים.

טופס ההעלאה זהה לזה שבסעיף הקודם.

נעבור ליצירת סרבל EE של ג'קרטה.

בשיטת עיבוד הבקשה שלנו, אנו יכולים לעטוף את הנכנסים HttpRequest עם בדיקה אם זו העלאה מרובת חלקים.

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

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

אם (ServletFileUpload.isMultipartContent (בקשה)) {DiskFileItemFactory מפעל = DiskFileItemFactory חדש (); factory.setSizeThreshold (MEMORY_THRESHOLD); factory.setRepository (קובץ חדש (System.getProperty ("java.io.tmpdir")); העלאת ServletFileUpload = ServletFileUpload חדש (מפעל); upload.setFileSizeMax (MAX_FILE_SIZE); upload.setSizeMax (MAX_REQUEST_SIZE); מחרוזת uploadPath = getServletContext (). GetRealPath ("") + File.separator + UPLOAD_DIRECTORY; קובץ uploadDir = קובץ חדש (uploadPath); אם (! uploadDir.exists ()) {uploadDir.mkdir (); } // ...}

ואז נוכל לחלץ את התוכן ולכתוב אותם לדיסק:

אם (ServletFileUpload.isMultipartContent (בקשה)) {// ... רשימת formItems = upload.parseRequest (בקשה); אם (formItems! = null && formItems.size ()> 0) {עבור (פריט FileItem: formItems) {if (! item.isFormField ()) {String fileName = קובץ חדש (item.getName ()). getName () ; מחרוזת filePath = uploadPath + File.separator + fileName; קובץ storeFile = קובץ חדש (filePath); item.write (storeFile); request.setAttribute ("הודעה", "קובץ" + קובץ שם + "הועלה בהצלחה!"); }}}}

4. הפעלת הדוגמא

לאחר שגיבשנו את הפרויקט שלנו ל- .מִלחָמָהאנחנו יכולים להעביר אותו למופע המקומי של Tomcat ולהפעיל אותו.

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

לאחר העלאת הקובץ שלנו בהצלחה, עלינו לראות את ההודעה:

לבסוף, אנו יכולים לבדוק את המיקום שצוין בסרוולט שלנו:

5. מסקנה

זהו זה! למדנו כיצד לספק העלאות קבצים מרובות חלקים באמצעות ג'קרטה EE, כמו גם את ה- Common של אפאצ'י העלאת קובץ סִפְרִיָה!

קטעי קוד, כמו תמיד, ניתן למצוא באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found