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.

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:
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.
A feltöltés gombra kattintva üzenetet kapunk a fájl sikeres feltöltéséről.
Az alábbi ábrán láthatjuk, hogy a fájl feltöltésre került a c:/guru/upload mappába.
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:
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.





