Spring and Apache FileUpload

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

ה ספריית העלאת קבצים של Apache Commons עוזר לנו להעלות קבצים גדולים דרך פרוטוקול HTTP באמצעות ה- נתונים מרובי חלקים / טפסים סוג תוכן.

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

2. תלות Maven

כדי להשתמש בספרייה, נצטרך את ה- commons-fileupload חפץ:

 commons-fileupload commons-fileupload 1.3.3 

ניתן למצוא את הגרסה האחרונה ב- Maven Central.

3. העברת הכל בבת אחת

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

@PostMapping ("/ upload") ציבורי מחרוזתUpload (HttpServletRequest בקשה) זורק חריג {בוליאני isMultipart = ServletFileUpload.isMultipartContent (בקשה); מפעל DiskFileItemFactory = DiskFileItemFactory חדש (); factory.setRepository (קובץ חדש (System.getProperty ("java.io.tmpdir"))); factory.setSizeThreshold (DiskFileItemFactory.DEFAULT_SIZE_THRESHOLD); factory.setFileCleaningTracker (null); העלאת ServletFileUpload = ServletFileUpload חדש (מפעל); פריטי רשימה = upload.parseRequest (בקשה); איטרטור איטר = items.iterator (); בעוד (iter.hasNext ()) {פריט FileItem = iter.next (); אם (! item.isFormField ()) {נסה (InputStream uploadedStream = item.getInputStream (); OutputStream out = FileOutputStream חדש ("file.mov");) {IOUtils.copy (uploadedStream, out); }}} להחזיר "הצלחה!"; } 

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

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

אנו יכולים להשיג זאת על ידי הכללת תצורה זו ב application.properties קוֹבֶץ:

spring.http.multipart.enabled = שקר

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

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

לאחר מכן, setSizeThreshold מגדיר גודל קובץ מרבי.

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

כעת נוכל להמשיך עם הטיפול בפועל בקבצים.

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

עכשיו אם אנו יודעים שזה לא שדה טופס רגיל, אז נמשיך לחלץ את InputStream ולקרוא לשיטת ההעתקה השימושית מ- IOUtils (לקבלת אפשרויות נוספות תוכלו להעיף מבט במדריך זה).

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

בחלק הבא, אנו נסתכל על ממשק ה- API לסטרימינג.

4. ממשק API לסטרימינג

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

העלאת ServletFileUpload = חדש ServletFileUpload (); FileItemIterator iterStream = upload.getItemIterator (בקשה); בעוד (iterStream.hasNext ()) פריט {FileItemStream = iterStream.next (); שם מחרוזת = item.getFieldName (); זרם InputStream = item.openStream (); אם (! item.isFormField ()) {// לעבד את InputStream} אחר {String formFieldValue = Streams.asString (stream); }} 

אנו יכולים לראות בקטע הקוד הקודם שאנחנו כבר לא כוללים DiskFileItemFactory. זה בגלל ש, בעת שימוש בממשק ה- API לסטרימינג, איננו זקוקים לו.

לאחר מכן, כדי לעבד שדות, הספרייה מספקת FileItemIterator, שלא קורא דבר עד שנחלץ אותם מהבקשה עם ה- הַבָּא שיטה.

לבסוף, אנו יכולים לראות כיצד להשיג את הערכים של שדות הטופס האחרים.

5. מסקנה

במאמר זה סקרנו כיצד נוכל להשתמש בספריית העלאת הקבצים של Apache Commons עם Spring כדי להעלות ולעבד קבצים גדולים.

כמו תמיד ניתן למצוא את קוד המקור המלא ב- GitHub.


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