Завантаження файлів JSP

⚡ Розумний підсумок

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

  • 📤 Основи завантаження: Використовуйте метод POST та встановіть enctype на multipart/form-data для будь-якого завантаження файлу.
  • 🧩 Apache Commons: DiskFileItemFactory та ServletFileUpload розбивають багаточастинний запит на файлові елементи.
  • 🗂️ Обробка сервлетів: Метод doPost перебирає елементи файлу та записує кожен у цільову папку.
  • 📥 Процес завантаження: Сервлет передає файл потоком, використовуючи FileInputStream та заголовок Content-Disposition.
  • Конфігурація: Шляхи до файлів, обмеження розміру та тип вмісту необхідно встановити перед читанням або записом.

Завантаження файлів JSP

Завантаження файлу 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

У цьому прикладі ми завантажимо файл за допомогою 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: Ось ми друкуємо це повідомлення.

Коли ми виконуємо наведений вище код, ми отримуємо наступний результат:

вихід:

Ми отримуємо форму, в якій є поля для вибору файлу з каталогу. Після вибору файлу нам потрібно натиснути кнопку завантаження.

Завантаження файлів за допомогою операцій 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, який буде укладено в 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, і ми отримаємо гіперпосилання «Завантажити тут». Коли ви натиснете на це гіперпосилання, файл буде завантажено в систему.

Поширені запитання

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

Так. Сканери на основі штучного інтелекту можуть перевіряти завантажені файли на наявність шкідливого програмного забезпечення, неочікуваних типів або надмірно великого обсягу корисних даних, перш ніж вони потраплять до сховища. Це додає рівень захисту, хоча перевірка типу та розміру на стороні сервера залишається важливою.

Кодування multipart/form-data розділяє запит на частини, тому дані двійкового файлу transmitнеушкодженим. Без нього браузер надсилає на сервер лише ім'я файлу, а не його фактичний вміст.

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

Підсумуйте цей пост за допомогою: