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: