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

Загрузка файла JSP
- Мы можем загружать любые файлы с помощью JSP.
- Это может быть текстовый файл, двоичный файл, файл изображения или любой другой документ.
- Здесь в случае загрузки файла будет использоваться только метод POST, а не метод GET.
- Атрибут Enctype должен иметь значение multipart/form-data.
Пример: использование действия
В этом примере мы загружаем файл, используя объект ввода-вывода.
Файл_действия.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>
Расшифровка кода:
Файл_действия.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 с типом файла и задаем размер 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 с объектами запроса и ответа.
Результат.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, он будет заключен в тег <a>. 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: Здесь мы взяли в то время как цикл Этот процесс будет продолжаться до тех пор, пока файл не будет прочитан, поэтому мы задали условие != -1. В этом условии мы используем объект printwriter для вывода данных.
При выполнении приведенного выше кода вы получите следующий результат:
Выход:
Нам нужно кликнуть на файл downloading_1.jsp, и мы получим гиперссылку «Скачать здесь». При нажатии на эту ссылку файл будет загружен в систему.





