Hochladen und Herunterladen von JSP-Dateien

⚡ Intelligente Zusammenfassung

JSP-Datei-Upload und -Download sind grundlegende Eingabe- und Ausgabevorgänge, mit denen eine Webanwendung Dateien von Benutzern empfängt und an diese ausliefert. Diese Ressource erklärt beide Abläufe anhand von JSP-Aktionsformularen, Apache Commons FileUpload und Servlet-Klassen und enthält vollständigen, lauffähigen Code.

  • 📤 Grundlagen zum Hochladen: Verwenden Sie die POST-Methode und setzen Sie enctype auf multipart/form-data für jeden Datei-Upload.
  • 🧩 Apache Commons: DiskFileItemFactory und ServletFileUpload zerlegen die Multipart-Anfrage in Dateielemente.
  • 🗂️ Servlet-Verarbeitung: Die Methode doPost iteriert über die Dateielemente und schreibt jedes einzelne in einen Zielordner.
  • 📥 Download-Ablauf: Ein Servlet streamt eine Datei mithilfe von FileInputStream und dem Content-Disposition-Header.
  • ⚙️ Konfiguration: Dateipfade, Größenbeschränkungen und Inhaltstyp müssen vor dem Lesen oder Schreiben festgelegt werden.

Hochladen und Herunterladen von JSP-Dateien

JSP-Datei-Upload

  • Wir können beliebige Dateien mit JSP hochladen.
  • Es kann eine Textdatei, eine Binärdatei, eine Bilddatei oder ein beliebiges anderes Dokument sein.
  • Hier wird beim Hochladen von Dateien nur die POST-Methode und nicht die GET-Methode verwendet.
  • Das Enctype-Attribut sollte auf multipart/form-data gesetzt sein.

Beispiel: Aktion verwenden

In diesem Beispiel laden wir eine Datei mithilfe eines IO-Objekts hoch.

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>

Erklärung des Codes:

Action_file.jsp

Code Zeile 12-18: Hier erstellen wir ein Formular mit einem Dateifeld, das eine Datei auf den Server hochlädt, und die Aktion wird an action_file_upload.jsp übergeben.

Action_file_upload.jsp

Code Linie 20: Hier geben wir den Dateipfad zu einem bestimmten Pfad an.

Code Zeile 23-38: Hier prüfen wir, ob der Inhaltstyp multipart/form-data ist. Ist dies der Fall, handelt es sich um einen Dateityp, der gelesen wird. Nach dem Lesen wird die Datei in eine temporäre Datei geschrieben, die anschließend in die Hauptdatei umgewandelt wird.

Wenn Sie den obigen Code ausführen, erhalten Sie die folgende Ausgabe:

JSP-Datei-Upload

Ausgang:

Wir laden eine Datei über die Schaltfläche „Datei auswählen“ hoch, und die Schaltfläche „Datei hochladen“ lädt die Datei auf den Server unter dem angegebenen Pfad hoch.

Beispiel: Verwenden von JSP-Operationen

In diesem Beispiel laden wir eine Datei mithilfe von JSP-Operationen hoch. Wir verwenden ein Formular mit einem „Hochladen“-Button. Wenn Sie auf diesen Button klicken, wird die Datei hochgeladen.

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

Erklärung des Codes:

Code Zeile 11-12: Hier verwenden wir ein Formular, das eine Aktion auf dem Servlet guru_upload ausführt und per POST-Methode gesendet wird. Das Attribut `enctype` legt fest, wie die Formulardaten kodiert und an den Server gesendet werden sollen. Es wird ausschließlich bei der POST-Methode verwendet. In diesem Fall setzen wir es auf `multipart/form-data`, um die Daten als Datei zu übertragen (da die Datenmenge groß sein wird).

Code Linie 13: Hier spezifizieren wir das guru_file-Element mit dem Typ Datei und geben die Größe mit 50 an.

Code Linie 15: Dies ist ein Absendebutton mit der Bezeichnung „Hochladen“. Über diesen Button wird das Action-Servlet aufgerufen, die Anfrage dort verarbeitet und die Datei im Servlet gelesen und geschrieben.

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

		    }


}

Erklärung des Codes:

Code Zeile 12-14: Hierfür müssen wir die Bibliothek org.apache.commons in die Codekonfiguration importieren. Wir müssen die Klasse fileupload aus der Bibliothek org.apache.commons importieren.

Code Linie 23: Hier haben wir die Methode doPost(), die aufgerufen wird, wenn wir die POST-Methode in JSP übergeben, und die Anfrage- und Antwortobjekte als Parameter entgegennimmt.

Code Linie 26: Hier erstellen wir ein Objekt der Klasse `ServletFileUpload` aus dem Paket `fileUpload` der Bibliothek `org.apache.commons`, das prüft, ob in der JSP-Datei Dateiobjekte vorhanden sind. Falls ja, werden diese aus der Anfrage übernommen.

Code Zeile 27-32: Wir durchlaufen die Anzahl der Dateien, indem wir prüfen, wie viele Dateielemente im Multiparts-Objekt (einem Listenobjekt, falls mehrere Dateien hochgeladen werden) vorhanden sind, und speichern diese unter dem angegebenen Dateinamen im Ordner „c:/guru/upload“. Die Datei wird mithilfe der „write“-Methode des Dateiobjekts in den genannten Ordner geschrieben.

Code Linie 34: Wenn keine Ausnahme auftritt, setzen wir das Attribut „gurumessage“ in der Anfrage auf den Wert „Datei erfolgreich hochgeladen“.

Code Zeile 35-36: Im Fehlerfall wird eine Meldung angezeigt, die besagt: „Datei-Upload fehlgeschlagen“.

Code Linie 40: Wenn die Datei nicht gefunden wird, wird die Meldung „Keine Datei gefunden“ angezeigt.

Code Linie 42: Die Anfrage wird mithilfe des requestdispatcher-Objekts an result.jsp mit Anfrage- und Antwortobjekten weitergeleitet.

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

Erklärung des Codes:

Code Linie 10: Hier holen wir uns das Attribut aus dem Anfrageobjekt mit dem Wert gurumessage und speichern es in einem String-Objekt.

Code Linie 11: Hier drucken wir diese Nachricht aus.

Wenn wir den obigen Code ausführen, erhalten wir die folgende Ausgabe:

Ausgang:

Es erscheint ein Formular mit Feldern zur Auswahl einer Datei aus dem Verzeichnis. Sobald die Datei ausgewählt ist, muss auf die Schaltfläche „Hochladen“ geklickt werden.

Dateiupload mithilfe von JSP-Operationen

Nach dem Klicken auf den Upload-Button erhalten wir die Meldung, dass die Datei erfolgreich hochgeladen wurde.

Dateiupload mithilfe von JSP-Operationen

Im folgenden Diagramm ist zu sehen, dass die Datei in den Ordner c:/guru/upload hochgeladen wurde.

Dateiupload mithilfe von JSP-Operationen

JSP-Datei herunterladen

In diesem Beispiel laden wir eine Datei aus einem Verzeichnis herunter, indem wir auf die Schaltfläche klicken.

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

Erklärung des Codes:

Code Linie 10: Hier haben wir einen Link bereitgestellt, um eine Datei aus dem Ordner c:/guru/upload mithilfe des Servlets guru_download herunterzuladen.

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
	}

}

Erklärung des Codes:

Code Zeile 3-5: Hier importieren wir FileInputStream, IOException und Print.Writer aus dem java.io-Paket.

Code Linie 15: Wir definieren den guru_download Servlet was HttpServlet erweitert.

Code Linie 18: Da wir einen href-Wert definiert haben, der in einem <a>-Tag eingeschlossen wird URLDaher wird die GET-Methode verarbeitet (doGet wird im Servlet aufgerufen), die auch Anfrage- und Antwortobjekte enthält.

Code Zeile 19-20: Wir setzen den Inhaltstyp im Antwortobjekt und rufen außerdem das Writer-Objekt aus der Antwort ab.

Code Zeile 21-22: Eine Variable namens gurufile mit dem Wert test.txt und gurupath mit dem Wert c:/guru/upload/ wird definiert.

Code Zeile 23-25: Wir legen den Inhaltstyp mithilfe des Antwortobjekts fest und verwenden die Methode setHeader, die den Header im Antwortobjekt als den Namen der hochgeladenen Datei festlegt.

Code Zeile 27-28: Wir erstellen einen FileInputStream, dem wir gurupath+gurufile hinzufügen werden.

Code Zeile 31-33: Hier haben wir eine genommen while-Schleife Dieser Vorgang läuft so lange, bis die Datei gelesen ist; daher haben wir die Bedingung als != -1 angegeben. In diesem Fall schreiben wir mit dem printwriter-Objekt in die Datei.

Wenn Sie den obigen Code ausführen, erhalten Sie folgende Ausgabe:

Ausgang:

Datei wird heruntergeladen

Wir müssen auf downloading_1.jsp klicken, dann erscheint ein Hyperlink mit der Aufschrift „Hier herunterladen“. Wenn Sie auf diesen Link klicken, wird die Datei heruntergeladen.

Häufig gestellte Fragen

Ja. KI-Assistenten können Servlets und JSP-Formulare für das Hoch- und Herunterladen von Dateien erstellen, die Logik von Apache Commons FileUpload hinzufügen und Validierungsvorschläge unterbreiten. Sie sollten den Code dennoch testen und Dateipfade sowie Größenbeschränkungen überprüfen.

Ja. KI-basierte Scanner können hochgeladene Dateien auf Schadsoftware, unerwartete Dateitypen oder zu große Datenmengen untersuchen, bevor sie gespeichert werden. Dies bietet eine zusätzliche Schutzebene, die serverseitige Überprüfung von Typ und Größe bleibt jedoch unerlässlich.

Die multipart/form-data-Kodierung teilt die Anfrage in Teile auf, sodass binäre Dateidaten vorliegen transmitDie Datei muss intakt sein. Ohne sie sendet der Browser nur den Dateinamen, nicht aber den eigentlichen Dateiinhalt, an den Server.

Apache Commons FileUpload ist zusammen mit Commons IO weit verbreitet. Es analysiert Multipart-Anfragen, stellt jedes FileItem bereit und schreibt den hochgeladenen Inhalt in ein ausgewähltes Verzeichnis auf dem Server.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: