Przesyłanie i pobieranie plików JSP

⚡ Inteligentne podsumowanie

Przesyłanie i pobieranie plików JSP to podstawowe operacje wejścia i wyjścia, które umożliwiają aplikacji internetowej odbieranie plików od użytkowników i udostępnianie ich z powrotem. W tym materiale wyjaśniono oba przepływy za pomocą formularzy akcji JSP, funkcji przesyłania plików Apache Commons oraz klas serwletów, wraz z kompletnym, działającym kodem.

  • 📤 Podstawy przesyłania: Użyj metody POST i ustaw enctype na multipart/form-data przy każdym przesyłaniu pliku.
  • 🧩 Wspólne Apache: DiskFileItemFactory i ServletFileUpload przetwarzają żądanie multipart na elementy pliku.
  • 🗂️. Obsługa serwletów: Metoda doPost iteruje elementy pliku i zapisuje każdy z nich do folderu docelowego.
  • 📥 Przebieg pobierania: Serwlet przesyła strumieniowo plik za pomocą FileInputStream i nagłówka Content-Disposition.
  • ⚙️ Konfiguracja: Przed odczytem lub zapisem należy ustawić ścieżki dostępu do plików, ograniczenia rozmiaru i typ zawartości.

Przesyłanie i pobieranie plików JSP

Przesyłanie pliku JSP

  • Możemy przesłać dowolne pliki za pomocą JSP.
  • Może to być plik tekstowy, plik binarny, plik obrazu lub dowolny inny dokument.
  • Tutaj w przypadku przesyłania pliku zostanie użyta tylko metoda POST, a nie metoda GET.
  • Atrybut Enctype powinien być ustawiony na multipart/form-data.

Przykład: użycie akcji

W tym przykładzie przesyłamy plik korzystając z obiektu IO.

Plik_akcji.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>

Wyjaśnienie kodu:

Plik_akcji.jsp

Code Linia 12-18: Tutaj tworzymy formularz z polem pliku, który prześle plik na serwer, a akcja zostanie przekazana do action_file_upload.jsp.

Action_file_upload.jsp

Code Linia 20: Tutaj podajemy ścieżkę do pliku do określonej ścieżki.

Code Linia 23-38: Tutaj sprawdzamy, czy typem zawartości jest multipart/form-data. Jeśli tak, zawartość jest typu pliku i jest odczytywana. Po odczytaniu plik jest zapisywany w pliku tymczasowym, a następnie plik tymczasowy jest konwertowany na plik główny.

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Przesyłanie pliku JSP

Wyjście:

Przesyłamy plik za pomocą przycisku „Wybierz plik”, a przycisk „Prześlij plik” prześle plik na serwer do wskazanej ścieżki.

Przykład: Korzystanie z operacji JSP

W tym przykładzie prześlemy plik za pomocą operacji JSP. Użyjemy formularza z przyciskiem „prześlij”, a po kliknięciu przycisku „prześlij” plik zostanie przesłany.

Przesyłanie_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>

Wyjaśnienie kodu:

Code Linia 11-12: Tutaj bierzemy formularz, który ma akcję na serwlecie guru_upload, która przejdzie przez metodę POST. Ponadto, atrybut enctype określa tutaj sposób kodowania i przesyłania danych formularza do serwera i jest używany tylko z metodą POST. Tutaj ustawiamy go jako multipart/form-data, co dotyczy pliku (ponieważ dane będą duże).

Code Linia 13: Tutaj określamy element guru_file z typem pliku i podajemy rozmiar 50.

Code Linia 15: To przycisk typu „Prześlij” o nazwie „Prześlij”, za pomocą którego zostanie wywołany serwlet akcji, żądanie zostanie przetworzone w tym serwlecie, a plik zostanie odczytany i zapisany w serwlecie.

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);

		    }


}

Wyjaśnienie kodu:

Code Linia 12-14: Tutaj będziemy musieli zaimportować bibliotekę org.apache.commons do konfiguracji kodu. Będziemy musieli zaimportować klasę fileupload z biblioteki org.apache.commons.

Code Linia 23: Tutaj mamy metodę doPost(), która zostanie wywołana, gdy przekazujemy metodę POST w JSP, i która będzie przyjmować obiekty żądania i odpowiedzi jako swoje parametry.

Code Linia 26: Tutaj tworzymy obiekt klasy ServletFileUpload z pakietu fileUpload biblioteki org.apache.commons, który sprawdzi, czy w JSP znajdują się jakieś obiekty plikowe. Jeśli takie zostaną znalezione, zostaną one pobrane z żądania.

Code Linia 27-32: Przeanalizujemy liczbę plików, sprawdzając, ile elementów znajduje się w obiekcie multiparts, który jest obiektem listy (jeśli przesyłamy więcej niż jeden plik), i zapiszemy go w folderze c:/guru/upload pod podaną nazwą. Plik zapisujemy za pomocą metody write obiektu file do wskazanego folderu.

Code Linia 34: Jeśli nie wystąpi żaden wyjątek, wówczas w żądaniu ustawiamy atrybut gurumessage z wartością „Plik przesłany pomyślnie”.

Code Linia 35-36: Jeśli wystąpi wyjątek, wyświetli się komunikat „Nie udało się przesłać pliku”.

Code Linia 40: Jeżeli plik nie zostanie znaleziony, wówczas ustawiamy komunikat „Nie znaleziono pliku”.

Code Linia 42: Przekazanie żądania za pomocą obiektu requestdispatcher do result.jsp z obiektami request i response.

Wynik.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>

Wyjaśnienie kodu:

Code Linia 10: Tutaj pobieramy atrybut z obiektu żądania o wartości gurumessage do obiektu ciągu.

Code Linia 11: Tutaj drukujemy tę wiadomość.

Po wykonaniu powyższego kodu otrzymamy następujący wynik:

Wyjście:

Otrzymujemy formularz, w którym znajdują się pola do wyboru pliku z katalogu. Po wybraniu pliku klikamy przycisk „Prześlij”.

Przesyłanie plików za pomocą operacji JSP

Po kliknięciu przycisku przesyłania pojawi się komunikat informujący o pomyślnym przesłaniu pliku.

Przesyłanie plików za pomocą operacji JSP

Na poniższym diagramie widać, że plik został przesłany do folderu c:/guru/upload.

Przesyłanie plików za pomocą operacji JSP

Pobierz plik JSP

W tym przykładzie pobierzemy plik z katalogu klikając na przycisk.

Pobieranie_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>

Wyjaśnienie kodu:

Code Linia 10: Tutaj podaliśmy link umożliwiający pobranie pliku z folderu c:/guru/upload za pomocą serwletu 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
	}

}

Wyjaśnienie kodu:

Code Linia 3-5: Tutaj importujemy FileInputStream, IOException i PrintWriter z pakietu java.io.

Code Linia 15: Definiujemy guru_download serwlet który rozszerza HttpServlet.

Code Linia 18: Ponieważ zdefiniowaliśmy href, który będzie ujęty w URL, więc metoda GET zostanie przetworzona (w serwlecie zostanie wywołana metoda doGet), która obejmuje również obiekty żądania i odpowiedzi.

Code Linia 19-20: Ustawiamy typ zawartości w obiekcie odpowiedzi i pobieramy również obiekt pisarza z odpowiedzi.

Code Linia 21-22: Zdefiniowanie zmiennej jako gurufile z wartością test.txt i gurupath jako c:/guru/upload/.

Code Linia 23-25: Ustawiamy typ zawartości za pomocą obiektu odpowiedzi i używamy metody setHeader, która ustawia nagłówek w obiekcie odpowiedzi jako nazwę przesłanego pliku.

Code Linia 27-28: Tworzymy strumień wejściowy FileInputStream, do którego dodamy gurupath+gurufile.

Code Linia 31-33: Tutaj wzięliśmy A pętla while który będzie działał do momentu odczytania pliku, stąd podaliśmy warunek != -1. W tym przypadku zapisujemy, używając obiektu printwriter.

Po wykonaniu powyższego kodu otrzymasz następujący wynik:

Wyjście:

Pobieranie pliku

Klikamy na plik downloading_1.jsp, a pojawi się hiperłącze „Pobierz tutaj”. Po kliknięciu tego hiperłącza plik zostanie pobrany do systemu.

FAQ

Tak. Asystenci AI mogą tworzyć szkielety serwletów i formularzy JSP do przesyłania i pobierania plików, dodawać logikę Apache Commons FileUpload i sugerować walidację. Nadal warto przetestować kod oraz sprawdzić ścieżki dostępu do plików i limity rozmiaru.

Tak. Skanery oparte na sztucznej inteligencji mogą sprawdzać przesyłane pliki pod kątem złośliwego oprogramowania, nieoczekiwanych typów lub zbyt dużych ładunków, zanim trafią one do pamięci masowej. Dodaje to warstwę ochrony, choć walidacja typu i rozmiaru po stronie serwera pozostaje niezbędna.

Kodowanie multipart/form-data dzieli żądanie na części, dzięki czemu dane pliku binarnego są transmitBez niego przeglądarka wysyła do serwera tylko nazwę pliku, a nie jego zawartość.

Apache Commons FileUpload, wraz z Commons IO, jest powszechnie używany. Analizuje żądania wieloczęściowe, udostępnia każdy element FileItem i zapisuje przesłaną zawartość do wybranego katalogu na serwerze.

Podsumuj ten post następująco: