נתוני תמונה / מדיה חוזרים עם MVC באביב

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

במדריך זה נמחיש כיצד להחזיר תמונות ומדיה אחרת באמצעות מסגרת MVC של Spring.

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

2. באמצעות HttpServletResponse

הגישה הבסיסית ביותר של הורדת התמונה היא לעבוד ישירות נגד תְגוּבָה חפץ ומחקה טהור סרוולט היישום, והודגם באמצעות הטקסט הבא:

@RequestMapping (value = "/ image-manual-response", method = RequestMethod.GET) public void getImageAsByteArray (HttpServletResponse response) זורק IOException {InputStream ב- = servletContext.getResourceAsStream ("/ WEB-INF / images / image-image) "); response.setContentType (MediaType.IMAGE_JPEG_VALUE); IOUtils.copy (ב, response.getOutputStream ()); }

הוצאת הבקשה הבאה תציג את התמונה בדפדפן:

//localhost:8080/spring-mvc-xml/image-manual-response.jpg

היישום די פשוט ופשוט בגלל IOUtils מ ה org.apache.commons.io חֲבִילָה. עם זאת, החיסרון של הגישה הוא שהיא לא חזקה מול השינויים האפשריים. סוג הפנטומימה מקודד קשה ושינוי לוגיקת ההמרה או החצנת מיקום התמונה דורשים שינויים בקוד.

החלק הבא דן בגישה גמישה יותר.

3. באמצעות HttpMessageConverter

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

  • הוסף הערה לשיטת הבקר באמצעות ה- @ResponseBody ביאור
  • רשום ממיר הודעות מתאים בהתבסס על סוג ההחזרה של שיטת הבקר (ByteArrayHttpMessageConverter לדוגמא הדרוש להמרה נכונה של מערך בתים לקובץ תמונה)

3.1. תְצוּרָה

לצורך הצגת תצורת הממירים נשתמש במובנה ByteArrayHttpMessageConverter הממיר הודעה בכל פעם ששיטה מחזירה את בתים [] סוּג.

ה ByteArrayHttpMessageConverter רשום כברירת מחדל, אך התצורה מקבילה לכל ממיר מובנה או מותאם אישית אחר.

החלת שעועית ממיר ההודעות מחייבת רישום מתאים MessageConverter שעועית בהקשר של MVC של אביב והגדרת סוגי מדיה שהיא צריכה להתמודד איתם. ניתן להגדיר זאת באמצעות XML באמצעות תָג.

יש להגדיר תג זה בפנים תג, כמו בדוגמה הבאה:

     תמונה / jpeg תמונה / png 

חלק התצורה הנ"ל יירשם ByteArrayHttpMessageConverter ל תמונה / jpeg ו תמונה / png סוגי תוכן תגובה. אם התג אינו קיים בתצורת ה- mvc, ואז ערכת הממירים המוגדרת כברירת מחדל תירשם.

כמו כן, תוכלו לרשום את ממיר ההודעות באמצעות תצורת Java:

@Override public void configureMessageConverters (רשימה ממירים) {converters.add (byteArrayHttpMessageConverter ()); } @Bean ByteArrayHttpMessageConverter ציבורי byteArrayHttpMessageConverter () {ByteArrayHttpMessageConverter arrayHttpMessageConverter = חדש ByteArrayHttpMessageConverter (); arrayHttpMessageConverter.setSupportedMediaTypes (getSupportedMediaTypes ()); מערך החזרה HttpMessageConverter; } רשימה פרטית getSupportedMediaTypes () {List list = new ArrayList (); list.add (MediaType.IMAGE_JPEG); list.add (MediaType.IMAGE_PNG); list.add (MediaType.APPLICATION_OCTET_STREAM); רשימת החזרה; }

3.2. יישום

כעת אנו יכולים ליישם את השיטה שלנו שתטפל בבקשות למדיה. כפי שהוזכר לעיל, עליך לסמן את שיטת הבקר שלך באמצעות ה- @ResponseBody ביאור ושימוש בתים [] כסוג החוזר:

@RequestMapping (value = "/ array-byte-array", method = RequestMethod.GET) ציבור @ResponseBody בייט [] getImageAsByteArray () זורק IOException {InputStream ב- = servletContext.getResourceAsStream ("/ WEB-INF / תמונות / תמונה לדוגמא .jpg "); החזר IOUtils.toByteArray (ב); }

כדי לבדוק את השיטה, הוציא את הדרישה הבאה בדפדפן שלך:

//localhost:8080/spring-mvc-xml/image-byte-array.jpg

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

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

4. באמצעות תגובה תגובה מעמד

אתה יכול להחזיר תמונה כ- בתים [] עטוף ב ישות תגובה. אביב MVC תגובה תגובה מאפשר שליטה לא רק על גוף תגובת ה- HTTP אלא גם על הכותרת וקוד מצב התגובה. בעקבות גישה זו, עליך להגדיר את סוג ההחזרה של השיטה כ- תגובה תגובה וליצור חוזר תגובה תגובה אובייקט בגוף השיטה.

@RequestMapping (value = "/ image-response-entity", method = RequestMethod.GET) ResponseEntity ציבורי getImageAsResponseEntity () {כותרות HttpHeaders = HttpHeaders חדש (); InputStream in = servletContext.getResourceAsStream ("/ WEB-INF / images / image-example.jpg"); בתים [] מדיה = IOUtils.toByteArray (ב); headers.setCacheControl (CacheControl.noCache (). getHeaderValue ()); ResponseEntity responseEntity = ResponseEntity חדש (מדיה, כותרות, HttpStatus.OK); תגובה חזרה }

משתמש ב תגובה תגובה מאפשר לך להגדיר קוד תגובה לבקשה נתונה.

הגדרה מפורשת של קוד התגובה שימושית במיוחד לנוכח אירוע חריג למשל. אם התמונה לא נמצאה (FileNotFoundException) או פגום (IOException). במקרים אלה, כל מה שנדרש הוא הגדרת קוד התגובה למשל. ResponseEntity חדש (null, headers, HttpStatus.NOT_FOUND), בגוש תפיסה הולם.

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

5. תמונה חוזרת באמצעות מַשׁאָב מעמד

לבסוף, אתה יכול להחזיר תמונה בצורה של מַשׁאָב לְהִתְנַגֵד.

ה מַשׁאָב ממשק הוא ממשק להפשטת גישה למשאבים ברמה נמוכה. הוא הוצג באביב כתחליף מסוגל יותר לתקן java.net.URL מעמד. זה מאפשר גישה נוחה לסוגים שונים של משאבים (קבצים מקומיים, קבצים מרוחקים, משאבי classpath) ללא צורך לכתוב קוד שיאחזר אותם במפורש.

כדי להשתמש בגישה זו יש להגדיר את סוג ההחזרה של השיטה מַשׁאָב ואתה צריך להוסיף הערה לשיטה באמצעות ה- @ResponseBody ביאור.

5.1. יישום

@ResponseBody @RequestMapping (value = "/ image-resource", method = RequestMethod.GET) משאבים ציבוריים getImageAsResource () {להחזיר ServletContextResource חדש (servletContext, "/WEB-INF/images/image-example.jpg"); }

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

@RequestMapping (value = "/ image-resource", method = RequestMethod.GET) @ResponseBody Public ResponseEntity getImageAsResource () {כותרות HttpHeaders = HttpHeaders חדש (); משאב משאבים = ServletContextResource חדש (servletContext, "/WEB-INF/images/image-example.jpg"); להחזיר ResponseEntity חדש (משאב, כותרות, HttpStatus.OK); }

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

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

6. מסקנה

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

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

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

קוד הדוגמה בעקבות ההדרכה זמין ב- GitHub.


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