JSP-bestand uploaden en downloaden

⚡ Slimme samenvatting

Het uploaden en downloaden van bestanden via JSP zijn essentiële invoer- en uitvoerbewerkingen waarmee een webapplicatie bestanden van gebruikers kan ontvangen en naar hen kan terugsturen. Deze handleiding legt beide processen uit met behulp van JSP-actieformulieren, Apache Commons FileUpload en servletklassen, inclusief volledig werkende code.

  • 📤 Basisprincipes van uploaden: Gebruik de POST-methode en stel enctype in op multipart/form-data voor elke bestandsupload.
  • 🧩 Apache-gemeenschappen: DiskFileItemFactory en ServletFileUpload parseren het multipart-verzoek in bestandsitems.
  • 🗂️ Servlet-afhandeling: De doPost-methode doorloopt de bestanden en schrijft elk bestand naar een doelfolder.
  • 📥 Downloadproces: Een servlet streamt een bestand met behulp van FileInputStream en de Content-Disposition-header.
  • ⚙️ Configuratie: Voordat je bestanden kunt lezen of schrijven, moeten de bestandspaden, de maximale bestandsgrootte en het bestandstype worden ingesteld.

JSP-bestand uploaden en downloaden

JSP-bestand uploaden

  • We kunnen alle bestanden uploaden met JSP.
  • Het kan een tekstbestand, binair bestand, afbeeldingsbestand of een ander document zijn.
  • In het geval van het uploaden van bestanden wordt hier alleen de POST-methode gebruikt en niet de GET-methode.
  • Het Enctype-attribuut moet worden ingesteld op multipart/form-data.

Voorbeeld: Actie gebruiken

In dit voorbeeld uploaden we een bestand met behulp van een IO-object.

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

Uitleg van de code:

Actie_bestand.jsp

Code Lijn 12-18: Hier maken we een formulier met een bestandsveld, waarmee een bestand naar de server wordt geüpload. De actie wordt doorgegeven aan action_file_upload.jsp.

Action_file_upload.jsp

Code Regel 20: Hier geven we het bestandspad op naar een specifiek pad.

Code Lijn 23-38: Hier controleren we of het inhoudstype multipart/form-data is. Als dat het geval is, dan is de inhoud van het type bestand en wordt deze gelezen. Nadat het bestand is gelezen, wordt het naar een tijdelijk bestand geschreven en vervolgens wordt dit tijdelijke bestand omgezet naar het hoofdbestand.

Wanneer u de bovenstaande code uitvoert, krijgt u de volgende uitvoer:

JSP-bestand uploaden

Output:

We uploaden een bestand via de knop 'Bestand kiezen', en met de knop 'Bestand uploaden' wordt het bestand geüpload naar de server op het opgegeven pad.

Voorbeeld: JSP-bewerkingen gebruiken

In dit voorbeeld gaan we een bestand uploaden met behulp van JSP-bewerkingen. We gebruiken een formulier met een "upload"-knop. Wanneer je op deze knop klikt, wordt het bestand geüpload.

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

Uitleg van de code:

Code Lijn 11-12: Hier gebruiken we een formulier met een actie op de servlet guru_upload, die via een POST-methode wordt verzonden. Het attribuut enctype specificeert hoe de formuliergegevens moeten worden gecodeerd en naar de server verzonden, en wordt alleen gebruikt bij de POST-methode. We stellen het hier in op multipart/form-data, wat geschikt is voor bestanden (aangezien de gegevens groot zullen zijn).

Code Regel 13: Hier specificeren we het element guru_file met het type bestand en geven we de grootte op 50.

Code Regel 15: Dit is een verzendknop met de naam "Uploaden". Via deze knop wordt de actieservlet aangeroepen, die het verzoek verwerkt en het bestand inleest en wegschrijft.

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

		    }


}

Uitleg van de code:

Code Lijn 12-14: Hier moeten we de bibliotheek org.apache.commons importeren in de configuratie van de code. We moeten de klasse fileupload importeren uit de bibliotheek org.apache.commons.

Code Regel 23: Hier hebben we de doPost()-methode, die wordt aangeroepen wanneer we de POST-methode in de JSP doorgeven, en die de request- en response-objecten als parameters ontvangt.

Code Regel 26: Hier maken we een object aan van de klasse ServletFileUpload uit het fileUpload-pakket van de org.apache.commons-bibliotheek. Dit object controleert of er bestandsobjecten in de JSP aanwezig zijn. Indien gevonden, worden deze uit het verzoek gehaald.

Code Lijn 27-32: We doorlopen het aantal bestanden door te controleren hoeveel bestanden er in het multiparts-object aanwezig zijn. Dit is een lijstobject (als we meer dan één bestand uploaden). Vervolgens slaan we het bestand op in de map c:/guru/upload met de opgegeven bestandsnaam. We schrijven het bestand naar de opgegeven map met behulp van de write-methode van het file-object.

Code Regel 34: Als er geen uitzondering is, stellen we een attribuut in het verzoek in als gurumessage met de waarde "Bestand succesvol geüpload".

Code Lijn 35-36: Als er een uitzondering optreedt, geven we de melding "Bestand uploaden mislukt" weer.

Code Regel 40: Als het bestand niet wordt gevonden, stellen we de melding in op "Geen bestand gevonden".

Code Regel 42: Het verzoek wordt via het requestdispatcher-object doorgestuurd naar result.jsp met de request- en response-objecten.

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

Uitleg van de code:

Code Regel 10: Hier halen we het attribuut met de waarde 'gurumessage' uit het request-object en slaan dit op in een string-object.

Code Regel 11: Hier drukken we dat bericht af.

Wanneer we de bovenstaande code uitvoeren, krijgen we de volgende uitvoer:

Output:

We krijgen een formulier te zien met velden om een ​​bestand uit de map te kiezen. Nadat het bestand is geselecteerd, moeten we op de uploadknop klikken.

Bestand uploaden met behulp van JSP-bewerkingen

Zodra er op de uploadknop wordt geklikt, krijgen we de melding dat het bestand succesvol is geüpload.

Bestand uploaden met behulp van JSP-bewerkingen

In het onderstaande diagram is te zien dat het bestand is geüpload naar de map c:/guru/upload.

Bestand uploaden met behulp van JSP-bewerkingen

JSP-bestand downloaden

In dit voorbeeld gaan we een bestand uit een map downloaden door op de knop te klikken.

Bezig met downloaden van_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>

Uitleg van de code:

Code Regel 10: Hier hebben we een link toegevoegd om een ​​bestand te downloaden uit de map c:/guru/upload met behulp van de servlet 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
	}

}

Uitleg van de code:

Code Lijn 3-5: Hier importeren we FileInputStream, IOException en Print.Writer uit het java.io-pakket.

Code Regel 15: We definiëren de guru_download servet die HttpServlet uitbreidt.

Code Regel 18: Aangezien we een href hebben gedefinieerd, die in een <a>-tag wordt geplaatst, URLDe GET-methode wordt dus verwerkt (doGet wordt aangeroepen in de servlet), waarbij ook de request- en response-objecten worden meegeleverd.

Code Lijn 19-20: We stellen het contenttype in het response-object in en halen ook het writer-object uit de response op.

Code Lijn 21-22: Een variabele definiëren als gurufile met de waarde test.txt en gurupath als c:/guru/upload/.

Code Lijn 23-25: We stellen het contenttype in met behulp van het response-object en gebruiken de setHeader-methode, die de header in het response-object instelt als de bestandsnaam van het geüploade bestand.

Code Lijn 27-28: We maken een FileInputStream aan waarin we gurupath+gurufile zullen toevoegen.

Code Lijn 31-33: Hier hebben we een genomen herhalingslus Dit programma blijft draaien totdat het bestand is gelezen, vandaar dat we de voorwaarde != -1 hebben ingesteld. In deze voorwaarde schrijven we naar de uitvoer met behulp van het PrintWriter-object.

Wanneer je de bovenstaande code uitvoert, krijg je de volgende uitvoer:

Output:

Bestand downloaden

We moeten klikken op downloading_1.jsp, waarna we een hyperlink krijgen met de tekst "Download hier". Wanneer je op deze hyperlink klikt, wordt het bestand gedownload naar je systeem.

Veelgestelde vragen

Ja. AI-assistenten kunnen servlets en JSP-formulieren genereren voor het uploaden en downloaden van bestanden, de logica van Apache Commons FileUpload toevoegen en validatiesuggesties doen. Je moet de code echter nog steeds testen en de bestandspaden en -groottebeperkingen controleren.

Ja. Op AI gebaseerde scanners kunnen geüploade bestanden controleren op malware, onverwachte bestandstypen of te grote payloads voordat ze worden opgeslagen. Dit biedt een extra beveiligingslaag, hoewel validatie van type en grootte aan de serverzijde essentieel blijft.

De multipart/form-data-codering splitst het verzoek op in delen, zodat binaire bestandsgegevens transmitted intact. Zonder dit stuurt de browser alleen de bestandsnaam, en niet de daadwerkelijke inhoud van het bestand, naar de server.

Apache Commons FileUpload, in combinatie met Commons IO, wordt veel gebruikt. Het parseert multipart-verzoeken, toont elk FileItem en schrijft de geüploade inhoud naar een gekozen map op de server.

Vat dit bericht samen met: