JSP fájl feltöltése és letöltése

⚡ Okos összefoglaló

A JSP fájlfeltöltés és -letöltés olyan alapvető bemeneti és kimeneti műveletek, amelyek lehetővé teszik a webalkalmazások számára, hogy fájlokat fogadjanak a felhasználóktól, és azokat visszaszolgáltassák nekik. Ez az anyag mindkét folyamatot bemutatja JSP műveleti űrlapok, Apache Commons FileUpload és servlet osztályok használatával, teljes működő kóddal.

  • 📤 Feltöltés alapjai: Használd a POST metódust, és állítsd az enctype értékét multipart/form-data értékre minden fájlfeltöltéshez.
  • 🧩 Apache Commons: A DiskFileItemFactory és a ServletFileUpload fájlelemekké elemzi a több részből álló kérést.
  • 🗂️ Szervletkezelés: A doPost metódus fájlelemeket iterál, és mindegyiket egy célmappába írja.
  • 📥 Letöltési folyamat: Egy servlet a FileInputStream és a Content-Disposition fejléc használatával streameli a fájlokat.
  • 🇧🇷 Konfiguráció: A fájlelérési utakat, a méretkorlátokat és a tartalomtípust be kell állítani olvasás vagy írás előtt.

JSP fájl feltöltése és letöltése

JSP fájl feltöltése

  • JSP használatával bármilyen fájlt feltölthetünk.
  • Ez lehet szövegfájl, bináris fájl, képfájl vagy bármilyen más dokumentum.
  • Itt fájlfeltöltés esetén csak a POST metódus kerül felhasználásra, a GET módszer nem.
  • Az Enctype attribútumot multipart/form-data értékre kell állítani.

Példa: Művelet használata

Ebben a példában egy fájlt töltünk fel az IO objektum használatával.

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>

A kód magyarázata:

Action_file.jsp

Code 12-18. sor: Itt létrehozunk egy űrlapot egy fájl mezővel, amely feltölt egy fájlt a szerverre, és a művelet átadódik az action_file_upload.jsp fájlnak.

Action_file_upload.jsp

Code 20 vonal: Itt megadjuk a fájl elérési útját egy adott elérési úthoz.

Code 23-38. sor: Itt azt ellenőrizzük, hogy a tartalom típusa többrészes/formátumú adat-e. Ha igen, akkor a tartalom fájl típusú, és beolvasásra kerül. A fájl beolvasása után az ideiglenes fájlba kerül, majd az ideiglenes fájl a fő fájllá alakul.

Amikor végrehajtja a fenti kódot, a következő kimenetet kapja:

JSP fájl feltöltése

output:

A fájl kiválasztása gombbal töltünk fel egy fájlt, a fájl feltöltése gombbal pedig a megadott elérési útra töltjük fel a fájlt a szerverre.

Példa: JSP-műveletek használata

Ebben a példában JSP műveletekkel fogunk feltölteni egy fájlt. Fogunk venni egy űrlapot, amelyen lesz egy „feltöltés” ​​gomb, és amikor a feltöltés gombra kattintunk, a fájl feltöltődik.

Feltöltés_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>

A kód magyarázata:

Code 11-12. sor: Itt egy olyan űrlapot veszünk, amelynek van egy művelete a guru_upload servleten, amely egy POST metóduson halad át. Az enctype attribútum itt is meghatározza, hogyan kell az űrlapadatokat kódolni és a szerverre küldeni, és csak a POST metódussal együtt használatos. Itt multipart/form-data-ként állítjuk be, ami a fájlhoz tartozik (mivel az adatok nagyok lesznek).

Code 13 vonal: Itt a guru_file elemet adjuk meg file típussal, és a méretet 50-ként adjuk meg.

Code 15 vonal: Ez egy „Feltöltés” ​​nevű beküldés típusú gomb, amelyen keresztül meghívódik az action servlet, amely feldolgozza a kérést, és beolvassa és kiírja a fájlt a servletbe.

Guru_feltöltés.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);

		    }


}

A kód magyarázata:

Code 12-14. sor: Itt importálnunk kell az org.apache.commons könyvtárat a kód konfigurációjába. Importálnunk kell a fileupload osztályt az org.apache.commons könyvtárból.

Code 23 vonal: Itt van a doPost() metódus, amelyet a JSP-ben a POST metódus átadásakor fogunk meghívni, és paraméterként kérés és válasz objektumokat fog fogadni.

Code 26 vonal: Itt létrehozunk egy ServletFileUpload osztályú objektumot az org.apache.commons könyvtár fileUpload csomagjából, amely ellenőrzi, hogy vannak-e fájlobjektumok a JSP-ben. Ha talál ilyet, akkor ezeket a fájlobjektumokat a kérésből veszi.

Code 27-32. sor: A fájlok számát úgy fogjuk ellenőrizni, hogy hány fájlelem található a multiparts objektumban, ami egy lista objektum (ha egynél több fájlt töltünk fel), és elmentjük a c:/guru/upload mappába a megadott fájlnévvel. A fájlt a file objektum write metódusával írjuk a megadott mappába.

Code 34 vonal: Ha nincs kivétel, akkor a kérésben egy gurumessage attribútumot állítunk be a „Fájl feltöltve” értékkel.

Code 35-36. sor: Ha kivétel történik, akkor a „Fájlfeltöltés sikertelen” üzenetet állítjuk be.

Code 40 vonal: Ha a fájl nem található, akkor a „Nem található fájl” üzenetet állítjuk be.

Code 42 vonal: A kérés továbbítása a result.jsp fájlba a requestdispatcher objektum használatával, kérés és válasz objektumokkal.

Eredmény.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>

A kód magyarázata:

Code 10 vonal: Itt a kérésobjektum attribútumát kapjuk meg gurumessage értékű karakterlánc objektumba.

Code 11 vonal: Itt nyomtatjuk ki ezt az üzenetet.

Amikor végrehajtjuk a fenti kódot, a következő kimenetet kapjuk:

output:

Kapunk egy űrlapot, amelyben mezők segítségével választhatunk ki egy fájlt a könyvtárból. Miután kiválasztottuk a fájlt, rá kell kattintanunk a feltöltés gombra.

Fájlfeltöltés JSP-műveletekkel

A feltöltés gombra kattintva üzenetet kapunk a fájl sikeres feltöltéséről.

Fájlfeltöltés JSP-műveletekkel

Az alábbi ábrán láthatjuk, hogy a fájl feltöltésre került a c:/guru/upload mappába.

Fájlfeltöltés JSP-műveletekkel

JSP fájl letöltése

Ebben a példában egy fájlt fogunk letölteni egy könyvtárból a gombra kattintva.

Letöltés_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>

A kód magyarázata:

Code 10 vonal: Itt megadtunk egy linket egy fájl letöltéséhez a c:/guru/upload mappából a guru_download servlet használatával.

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
	}

}

A kód magyarázata:

Code 3-5. sor: Itt importáljuk a FileInputStream, IOException és Print függvényeket.Writer a java.io csomagból.

Code 15 vonal: A guru_download definiálását végezzük. szervlet amely kiterjeszti a HttpServletet.

Code 18 vonal: Ahogy definiáltuk a href-et, amelyet egy URL, így a GET metódus feldolgozásra kerül (a doGet metódus meghívódik a servletben), amely a kérés- és válaszobjektumokat is magába foglalja.

Code 19-20. sor: A tartalomtípust a válaszobjektumban állítjuk be, és a válaszból kinyerjük az író objektumot is.

Code 21-22. sor: Változó definiálása gurufile-ként test.txt értékkel és gurupath-ként c:/guru/upload/.

Code 23-25. sor: A tartalomtípust a response objektummal állítjuk be, ehhez pedig a setHeader metódust használjuk, amely a feltöltött fájlnévként beállítja a fejlécet a response objektumban.

Code 27-28. sor: Létrehozunk egy FileInputStream fájlt, amelybe hozzáadjuk a gurupath+gurufile paramétereket.

Code 31-33. sor: Itt vettük a míg hurok , amely a fájl beolvasásáig fut, ezért a feltételt a következőképpen adtuk meg: != -1. Ebben a feltételben a printwriter objektumot használjuk írás közben.

Amikor végrehajtod a fenti kódot, a következő kimenetet kapod:

output:

Fájl letöltése

A downloading_1.jsp fájlra kell kattintanunk, és egy „Download Here” feliratú hiperhivatkozást kapunk. Amikor erre a hiperhivatkozásfájlra kattintunk, az letöltődik a rendszerbe.

GYIK

Igen. A mesterséges intelligencia asszisztensek képesek servleteket és JSP űrlapokat scaffolgáltatni a fájlok feltöltéséhez és letöltéséhez, Apache Commons FileUpload logikát hozzáadni, és validálást javasolni. Továbbra is tesztelni kell a kódot, és át kell tekinteni a fájlelérési utakat és a méretkorlátokat.

Igen. A mesterséges intelligencia alapú szkennerek képesek megvizsgálni a feltöltött fájlokat rosszindulatú programok, váratlan típusok vagy túlméretezett adatmennyiségek után, mielőtt azok elérnék a tárolót. Ez egy további védelmi réteget biztosít, bár a típus és a méret szerveroldali ellenőrzése továbbra is elengedhetetlen.

A többrészes/formaadat-kódolás részekre bontja a kérést, így a bináris fájladatok transmitép állapotban van. Enélkül a böngésző csak a fájlnevet küldi el a szervernek, nem magát a fájl tartalmát.

Az Apache Commons FileUpload a Commons IO-val együtt széles körben használt. Elemzi a többrészes kéréseket, elérhetővé teszi az egyes FileItem-eket, és a feltöltött tartalmat a szerver egy kiválasztott könyvtárába írja.

Foglald össze ezt a bejegyzést a következőképpen: