Завантаження файлів JSP
⚡ Розумний підсумок
Завантаження та завантаження файлів JSP – це основні операції введення та виведення, які дозволяють веб-застосунку отримувати файли від користувачів та повертати їх їм. У цьому ресурсі пояснюються обидва процеси за допомогою форм дій JSP, Apache Commons FileUpload та класів сервлетів, а також повний робочий код.

Завантаження файлу JSP
- Ми можемо завантажити будь-які файли за допомогою JSP.
- Це може бути текстовий файл, двійковий файл, файл зображення або будь-який інший документ.
- Тут у разі завантаження файлу буде використано лише метод POST, а не метод GET.
- Для атрибута enctype має бути встановлено multipart/form-data.
Приклад: Використання дії
У цьому прикладі ми завантажуємо файл за допомогою об'єкта вводу-виводу.
Action_file.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Guru File</title> </head> <body> <a>Guru File Upload:</a> Select file: <br /> <form action="action_file_upload.jsp" method="post" enctype="multipart/form-data"> <input type="file" name="file" size="50" /> <br /> <input type="submit" value="Upload File" /> </form> </body> </html>
Action_file_upload.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@ page import="java.io.*,java.util.*, javax.servlet.*" %> <%@ page import="javax.servlet.http.*" %> <%@ page import="org.apache.commons.fileupload.*" %> <%@ page import="org.apache.commons.fileupload.disk.*" %> <%@ page import="org.apache.commons.fileupload.servlet.*" %> <%@ page import="org.apache.commons.io.output.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Guru File Upload</title> </head> <body> <% File file ; int maxFileSize = 5000 * 1024; int maxMemSize = 5000 * 1024; String filePath = "E:/guru99/data"; String contentType = request.getContentType(); if ((contentType.indexOf("multipart/form-data") >= 0)) { DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(maxMemSize); factory.setRepository(new File("c:\\temp")); ServletFileUpload upload = new ServletFileUpload(factory); upload.setSizeMax( maxFileSize ); try{ List fileItems = upload.parseRequest(request); Iterator i = fileItems.iterator(); out.println("<html>"); out.println("<body>"); while ( i.hasNext () ) { FileItem fi = (FileItem)i.next(); if ( !fi.isFormField () ) { String fieldName = fi.getFieldName(); String fileName = fi.getName(); boolean isInMemory = fi.isInMemory(); long sizeInBytes = fi.getSize(); file = new File( filePath + "yourFileName") ; fi.write( file ) ; out.println("Uploaded Filename: " + filePath + fileName + "<br>"); } } out.println("</body>"); out.println("</html>"); }catch(Exception ex) { System.out.println(ex); } }else{ out.println("<html>"); out.println("<body>"); out.println("<p>No file uploaded</p>"); out.println("</body>"); out.println("</html>"); } %> </body> </html>
Пояснення коду:
Action_file.jsp
Code Рядок 12-18: Тут ми створюємо форму з полем файлу, яке завантажить файл на сервер, а дія буде передана до action_file_upload.jsp.
Action_file_upload.jsp
Code Лінія 20: Тут ми вказуємо шлях до файлу за певним шляхом.
Code Рядок 23-38: Тут ми перевіряємо, чи тип контенту є multipart/form-data. Якщо це так, то контент має тип файлу, і він зчитується. Після зчитування файлу він записується у тимчасовий файл, а потім тимчасовий файл перетворюється на основний файл.
Коли ви виконуєте наведений вище код, ви отримуєте такий результат:
вихід:
Ми завантажуємо файл за допомогою опції вибору файлу, а кнопка завантаження файлу завантажить файл на сервер за вказаним шляхом.
Приклад: використання операцій JSP
У цьому прикладі ми завантажимо файл за допомогою JSP-операцій. Ми візьмемо форму з кнопкою «завантажити», і коли ви натиснете на неї, файл буде завантажено.
Завантаження_1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Guru Uploading File</title> </head> <body> File: <br /> <form action="guru_upload" method="post" enctype="multipart/form-data"> <input type="file" name="guru_file" size="50" /> <br /> <input type="submit" value="Upload" /> </form> </body> </html>
Пояснення коду:
Code Рядок 11-12: Тут ми беремо форму, яка має дію на сервлет guru_upload, що проходитиме через метод POST. Також тут атрибут enctype визначає, як дані форми повинні бути закодовані та надіслані на сервер, і він використовується лише з методом POST. Тут ми встановлюємо його як multipart/form-data, що призначено для файлу (оскільки дані будуть великими).
Code Лінія 13: Тут ми вказуємо елемент guru_file з типом file та розміром 50.
Code Лінія 15: Це кнопка типу "Надіслати" з назвою "Завантажити", через яку буде викликано сервлет дії, запит буде оброблено в ньому, а файл буде прочитано та записано в сервлет.
Guru_upload.java
package demotest; import java.io.File; import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; public class guru_upload extends HttpServlet { private static final long serialVersionUID = 1L; public guru_upload() { super(); // TODO Auto-generated constructor stub } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { if(ServletFileUpload.isMultipartContent(request)){ try { List <FileItem> multiparts = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request); for(FileItem item : multiparts){ if(!item.isFormField()){ String name = new File(item.getName()).getName(); item.write( new File("c:/guru/upload" + File.separator + name)); } } //File uploaded successfully request.setAttribute("gurumessage", "File Uploaded Successfully"); } catch (Exception ex) { request.setAttribute("gurumessage", "File Upload Failed due to " + ex); } }else{ request.setAttribute("gurumessage","No File found"); } request.getRequestDispatcher("/result.jsp").forward(request, response); } }
Пояснення коду:
Code Рядок 12-14: Тут нам потрібно буде імпортувати бібліотеку org.apache.commons у конфігурацію коду. Нам потрібно буде імпортувати клас fileupload з бібліотеки org.apache.commons.
Code Лінія 23: Тут у нас є метод doPost(), який буде викликано під час передачі методу POST в JSP, і він прийматиме об'єкти запиту та відповіді як параметри.
Code Лінія 26: Тут ми створюємо об'єкт класу ServletFileUpload з пакета fileUpload бібліотеки org.apache.commons, який перевірятиме наявність файлових об'єктів у JSP. Якщо такі будуть знайдені, то ці файлові об'єкти будуть взяті із запиту.
Code Рядок 27-32: Ми переберемо кількість файлів, перевіряючи, скільки елементів файлу присутні в об'єкті multiparts, який є об'єктом списку (якщо ми завантажуємо більше одного файлу), і збережемо його в папці c:/guru/upload з наданою назвою файлу. Ми записуємо файл за допомогою методу write об'єкта file у згадану папку.
Code Лінія 34: Якщо винятку немає, то ми встановлюємо атрибут у запиті як gurumessage зі значенням «Файл успішно завантажено».
Code Рядок 35-36: Якщо виникає виняток, то ми встановлюємо повідомлення «Завантаження файлу не вдалося».
Code Лінія 40: Якщо файл не знайдено, то ми встановлюємо повідомлення «Файл не знайдено».
Code Лінія 42: Переадресація запиту за допомогою об'єкта requestdispatcher до result.jsp з об'єктами request та response.
Result.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Guru Result</title> </head> <body> <% String msg = (String)request.getAttribute("message"); out.println(msg); %> </body> </html>
Пояснення коду:
Code Лінія 10: Тут ми отримуємо атрибут з об'єкта запиту зі значенням gurumessage в рядковий об'єкт.
Code Лінія 11: Ось ми друкуємо це повідомлення.
Коли ми виконуємо наведений вище код, ми отримуємо наступний результат:
вихід:
Ми отримуємо форму, в якій є поля для вибору файлу з каталогу. Після вибору файлу нам потрібно натиснути кнопку завантаження.
Після натискання кнопки завантаження ми отримуємо повідомлення про успішне завантаження файлу.
На діаграмі нижче ми бачимо, що файл було завантажено до папки c:/guru/upload.
Завантаження файлу JSP
У цьому прикладі ми збираємося завантажити файл із каталогу, натиснувши кнопку.
Завантаження_1.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Downloading Guru Example</title> </head> <body> Guru Downloading File<a href="guru_download">Download here!!!</a> </body> </html>
Пояснення коду:
Code Лінія 10: Тут ми надали посилання для завантаження файлу з папки c:/guru/upload за допомогою сервлета guru_download.
Guru_download.java
package demotest; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class guru_download */ public class guru_download extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); String gurufile = "test.txt"; String gurupath = "c:/guru/upload/"; response.setContentType("APPLICATION/OCTET-STREAM"); response.setHeader("Content-Disposition", "attachment; filename=\"" + gurufile + "\""); FileInputStream fileInputStream = new FileInputStream(gurupath + gurufile); int i; while ((i = fileInputStream.read()) != -1) { out.write(i); } fileInputStream.close(); out.close(); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub } }
Пояснення коду:
Code Рядок 3-5: Тут ми імпортуємо FileInputStream, IOException та Print.Writer з пакета java.io.
Code Лінія 15: Ми визначаємо guru_download сервлет який розширює HttpServlet.
Code Лінія 18: Як ми вже визначили href, який буде укладено в URL, тому буде оброблено метод GET (doGet буде викликано в сервлеті), який також містить об'єкти запиту та відповіді.
Code Рядок 19-20: Ми встановлюємо тип вмісту в об'єкті відповіді, а також отримуємо об'єкт writer з відповіді.
Code Рядок 21-22: Визначення змінної як gurufile зі значенням test.txt та gurupath як c:/guru/upload/.
Code Рядок 23-25: Ми встановлюємо тип контенту за допомогою об'єкта відповіді та використовуємо метод setHeader, який встановлює заголовок в об'єкт відповіді як ім'я завантаженого файлу.
Code Рядок 27-28: Ми створюємо FileInputStream, в який додамо gurupath+gurufile.
Code Рядок 31-33: Тут ми взяли a поки петля який виконуватиметься доти, доки файл не буде прочитано, тому ми задали умову як != -1. У цій умові ми записуємо, використовуючи об'єкт printwriter.
Коли ви виконаєш наведений вище код, отримаєш наступний вивід:
вихід:
Нам потрібно натиснути на downloading_1.jsp, і ми отримаємо гіперпосилання «Завантажити тут». Коли ви натиснете на це гіперпосилання, файл буде завантажено в систему.





