Загрузка и выгрузка файла JSP

⚡ Умное резюме

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

  • 📤 Основные правила загрузки: Для загрузки любого файла используйте метод POST и установите enctype в значение multipart/form-data.
  • 🧩 Общие сведения Апача: Функции DiskFileItemFactory и ServletFileUpload преобразуют многокомпонентный запрос в файловые элементы.
  • 🇧🇷 Обработка сервлетов: Метод doPost перебирает элементы файла и записывает каждый из них в целевую папку.
  • 📥 Загрузка потока: Сервлет передает файл потоком, используя FileInputStream и заголовок Content-Disposition.
  • ⚙️ Конфигурация: Перед чтением или записью необходимо установить пути к файлам, ограничения по размеру и тип содержимого.

Загрузка и выгрузка файла JSP

Загрузка файла 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

В этом примере мы будем загружать файл с помощью операций 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: Здесь мы печатаем это сообщение.

Когда мы выполним приведенный выше код, мы получим следующий вывод:

Выход:

Мы видим форму, в которой есть поля для выбора файла из каталога. После выбора файла необходимо нажать кнопку «Загрузить».

Загрузка файла с использованием операций JSP

После нажатия кнопки загрузки появляется сообщение об успешной загрузке файла.

Загрузка файла с использованием операций JSP

На приведенной ниже диаграмме видно, что файл был загружен в папку c:/guru/upload.

Загрузка файла с использованием операций 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>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, и мы получим гиперссылку «Скачать здесь». При нажатии на эту ссылку файл будет загружен в систему.

Часто задаваемые вопросы (FAQ)

Да. Искусственный интеллект может создавать шаблоны сервлетов и JSP-форм для загрузки и скачивания файлов, добавлять логику Apache Commons FileUpload и предлагать варианты проверки. Тем не менее, вам следует протестировать код и проверить пути к файлам и ограничения по их размеру.

Да. Сканеры на основе ИИ могут проверять загруженные файлы на наличие вредоносного ПО, неожиданных типов или слишком больших объемов данных до того, как они попадут в хранилище. Это добавляет дополнительный уровень защиты, хотя проверка типа и размера на стороне сервера по-прежнему имеет важное значение.

Кодировка multipart/form-data разделяет запрос на части, поэтому данные двоичного файла обрабатываются следующим образом: transmitОн остается неизменным. Без него браузер отправляет на сервер только имя файла, а не его фактическое содержимое.

Apache Commons FileUpload, совместно с Commons IO, широко используется. Он анализирует многокомпонентные запросы, предоставляет доступ к каждому FileItem и записывает загруженное содержимое в выбранную директорию на сервере.

Подведем итог этой публикации следующим образом: