דוגמה להורדת קובץ ב- Servlet

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

מאפיין נפוץ של יישומי אינטרנט הוא האפשרות להוריד קבצים.

במדריך זה, נסקור דוגמה פשוטה ליצירת קובץ להורדה והגשתו מיישום Java Servlet.

הקובץ בו אנו משתמשים יהיה ממקורות ה- webapp.

2. תלות Maven

אם אתה משתמש בג'קרטה EE, לא נצטרך להוסיף תלות כלשהי. עם זאת, אם אנו משתמשים ב- Java SE, נזדקק לתלות javax.servlet-api:

 javax.servlet javax.servlet-api 4.0.1 מסופק 

הגרסה האחרונה של התלות נמצאת כאן.

3. סרוולט

בואו נסתכל תחילה על הקוד ואז נגלה מה קורה:

@WebServlet ("/ download") מחלקה ציבורית DownloadServlet מרחיב HttpServlet {final final int ARBITARY_SIZE = 1048; @Override מוגן בטל doGet (HttpServletRequest req, HttpServletResponse resp) זורק ServletException, IOException {resp.setContentType ("טקסט / רגיל"); resp.setHeader ("תוכן דיספוזיציה", "קובץ מצורף; שם קובץ = sample.txt"); נסה (InputStream ב- = req.getServletContext (). getResourceAsStream ("/ WEB-INF / sample.txt"); OutputStream out = resp.getOutputStream ()) {בייט [] חיץ = בתים חדשים [ARBITARY_SIZE]; מספר numBytesRead; בעוד ((numBytesRead = in.read (חיץ))> 0) {out.write (חיץ, 0, numBytesRead); }}}}

3.1. בקש נקודת סיום

@WebServlet ("/ הורד") ביאור מסמן את DownloadServlet בכיתה להגיש בקשות המופנות אל "/הורד" נקודת סיום.

לחלופין, אנו יכולים לעשות זאת על ידי תיאור המיפוי בקובץ web.xml.

3.2. תְגוּבָה סוג תוכן

ה HttpServletResponse לאובייקט יש שיטה הנקראת בשם setContentType שבה נוכל להגדיר את סוג תוכן כותרת של תגובת HTTP.

סוג תוכן הוא השם ההיסטורי של מאפיין הכותרת. שם אחר היה סוג MIME (הרחבות דואר אינטרנט רב תכליתי). כעת אנו פשוט מתייחסים לערך כסוג המדיה.

ערך זה יכול להיות "יישום / pdf", "טקסט / רגיל", "טקסט / HTML", "תמונה / jpg" וכו '., הרשימה הרשמית מתנהלת על ידי רשות המספרים המוקצים באינטרנט (IANA) וניתן למצוא אותה כאן.

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

3.3. תְגוּבָה דיספוזיציה של תוכן

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

הדפדפנים מבינים את השימוש ב דיספוזיציה של תוכן כמוסכמה אבל זה לא ממש חלק מתקן HTTP. ל- W3 יש תזכיר על השימוש ב- דיספוזיציה של תוכן זמין לקריאה כאן.

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

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

באמצעות פרמטר כותרת אופציונלי, אנו יכולים לציין את שם הקובץ "sample.txt".

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

הפעולה המדויקת שתבוצע תלויה בדפדפן.

3.4. קריאה מקובץ וכתיבה לזרם פלט

בשורות הקוד הנותרות, אנו לוקחים את ServletContext מהבקשה, והשתמש בה כדי להשיג את הקובץ בכתובת "/WEB-INF/sample.txt".

באמצעות HttpServletResponse#getOutputStream ()לאחר מכן אנו קוראים מזרם הקלט של המשאב וכותבים לתגובות OutputStream.

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

מחזור זה נמשך עד numByteRead הוא 0 כי זה מציין את סוף הקובץ.

3.5. סגור ושטוף

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

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

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

3.6. הורדת הקובץ

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

עכשיו כשאנחנו מבקרים בנקודת הסיום היחסית "/הורד", הדפדפן שלנו ינסה להוריד את הקובץ כ- "simple.txt".

4. מסקנה

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

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

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


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