העלאת MultipartFile עם RestTemplate Spring

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

הדרכה מהירה זו מתמקדת כיצד להעלות קובץ מרובה חלקים באמצעות RestTemplate של Spring.

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

2. מהי בקשת HTTP מרובת חלקים?

במילים פשוטות, גוף בקשת HTTP POST בסיסי מחזיק נתוני טופס בזוגות שם / ערך.

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

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

קרא כאן יותר על בקשות מרובות חלקים.

3. תלות של Maven

תלות יחידה זו מספיקה ליישום הלקוח:

 org.springframework spring-web 5.2.2.RELEASE 

4. ה שרת העלאת קבצים

ממשק ה- API של שרת הקבצים חושף שתי נקודות קצה של REST להעלאת קבצים בודדים ומספר רב בהתאמה:

  • POST / שרת קבצים / singlefileupload /
  • POST / שרת קבצים / העלאה מרובה קבצים /

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

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

אנחנו צריכים ליצור HttpEntityעם כותרת וגוף. הגדר את סוג תוכן ערך כותרת ל- MediaType.MULTIPART_FORM_DATA. כאשר כותרת זו מוגדרת, RestTemplate מבצע רישום אוטומטי של נתוני הקבצים יחד עם כמה מטא נתונים.

מטא נתונים כוללים שם קובץ, גודל קובץ וסוג תוכן הקובץ (למשל טקסט / רגיל):

כותרות HttpHeaders = HttpHeaders חדשות (); headers.setContentType (MediaType.MULTIPART_FORM_DATA);

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

בדוגמה שלנו, ה getTestFile () שיטה מייצרת קובץ דמה בזמן ומחזירה a FileSystemResource:

גוף MultiValueMap = חדש LinkedMultiValueMap (); body.add ("קובץ", getTestFile ());

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

שים לב שהעלאת הקובץ היחיד מצביעה על ה- / שרת קבצים / singlefileupload / נקודת סיום.

בסופו של דבר, השיחה restTemplate.postForEntity () משלים את מלאכת החיבור לכתובת ה- URL הנתונה ושליחת הקובץ לשרת:

HttpEntity requestEntity = HttpEntity חדש (גוף, כותרות); מחרוזת serverUrl = "// localhost: 8082 / spring-rest / fileserver / singlefileupload /"; RestTemplate restTemplate = RestTemplate חדש (); תגובה ResponseEntity = restTemplate .postForEntity (serverUrl, requestEntity, String.class);

6. העלאת קבצים מרובים

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

בואו ניצור מספר קבצים ו הוסף אותם עם אותו מפתח ב MultiValueMap.

ברור שכתובת ה- URL של הבקשה צריכה להתייחס לנקודת קצה להעלאת קבצים מרובים:

גוף MultiValueMap = חדש LinkedMultiValueMap (); body.add ("קבצים", getTestFile ()); body.add ("קבצים", getTestFile ()); body.add ("קבצים", getTestFile ()); HttpEntity requestEntity = HttpEntity חדש (גוף, כותרות); מחרוזת serverUrl = "// localhost: 8082 / spring-rest / fileserver / multiplefileupload /"; RestTemplate restTemplate = RestTemplate חדש (); תגובה ResponseEntity = restTemplate .postForEntity (serverUrl, requestEntity, String.class);

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

7. מסקנה

לסיכום, ראינו מקרה של MultipartFile העברה באמצעות אביב RestTemplate.

כמו תמיד, קוד המקור של הלקוח והשרת זמין ב- GitHub.