JSP-faili üleslaadimine ja allalaadimine
⚡ Nutikas kokkuvõte
JSP-faili üleslaadimine ja allalaadimine on põhilised sisend- ja väljundoperatsioonid, mis võimaldavad veebirakendusel kasutajatelt faile vastu võtta ja neile faile tagasi saata. See ressurss selgitab mõlemat voogu JSP-toimingute vormide, Apache Commonsi FileUploadi ja servletiklasside abil koos täieliku töötava koodiga.

JSP-faili üleslaadimine
- Saame JSP-ga üles laadida mis tahes faile.
- See võib olla tekstifail, binaarfail, pildifail või mõni muu dokument.
- Siin kasutatakse failide üleslaadimisel ainult POST-meetodit, mitte GET-meetodit.
- Enctype atribuudiks tuleks määrata multipart/form-data.
Näide: toimingu kasutamine
Selles näites laadime faili üles IO-objekti abil.
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>
Koodi selgitus:
Action_file.jsp
Code Rida 12-18: Siin loome vormi failiväljaga, mis laadib faili serverisse üles ja toiming edastatakse failile action_file_upload.jsp.
Action_file_upload.jsp
Code Rida 20: Siin anname failitee konkreetsele teele.
Code Rida 23-38: Siin kontrollime, kas sisutüüp on multipart/form-data. Kui see on nii, siis on sisu failitüüpi ja seda loetakse. Pärast faili lugemist kirjutatakse see ajutisse faili ja seejärel teisendatakse ajutine fail põhifailiks.
Kui käivitate ülaltoodud koodi, saate järgmise väljundi:
Väljund:
Laadime faili üles valiku „Vali fail“ abil ja nupp „Laadi fail üles“ laadib faili serverisse üles antud teele.
Näide: JSP-operatsioonide kasutamine
Selles näites laadime faili üles JSP-operatsioonide abil. Võtame vormi, millel on nupp „Laadi üles” ja kui klõpsate üleslaadimisnupul, laaditakse fail üles.
Üleslaadimine_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>
Koodi selgitus:
Code Rida 11-12: Siin võtame vormi, millel on toiming servletil guru_upload, mis läbib POST-meetodi. Samuti määrab siin atribuut enctype, kuidas vormi andmeid tuleks kodeerida ja serverisse saata, ning seda kasutatakse ainult POST-meetodiga. Siin määrame selle multipart/form-data-ks, mis on faili jaoks (kuna andmed on suured).
Code Rida 13: Siin määrame guru_file elemendi tüübiks „fail“ ja suuruseks 50.
Code Rida 15: See on saatmistüüpi nupp nimega „Laadi üles“, mille kaudu kutsutakse välja toiminguservlett, mis töötleb päringu ning loeb ja kirjutab faili servletti.
Guru_üleslaadimine.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); } }
Koodi selgitus:
Code Rida 12-14: Siin peame importima org.apache.commonsi teegi koodi konfiguratsiooni. Peame importima fileupload klassi org.apache.commonsi teegist.
Code Rida 23: Siin on meil meetod doPost(), mida kutsutakse JSP-s POST-meetodi edastamisel ning mis võtab parameetriteks päringu- ja vastuseobjektid.
Code Rida 26: Siin loome org.apache.commonsi teegi fileUpload paketist ServletFileUpload klassi objekti, mis kontrollib, kas JSP-s on failiobjekte. Kui neid leitakse, võetakse need failiobjektid päringust.
Code Rida 27-32: Me itereerime failide arvu, kontrollides, mitu failiüksust on multiparts-objektis, mis on loendiobjekt (kui laadime üles rohkem kui ühe faili), ja salvestame selle kausta c:/guru/upload antud failinimega. Kirjutame faili failiobjekti write-meetodi abil mainitud kausta.
Code Rida 34: Kui erandeid pole, määrame päringule atribuudi gurumessage väärtusega „Fail edukalt üles laaditud”.
Code Rida 35-36: Erandi ilmnemisel kuvatakse teade „Faili üleslaadimine ebaõnnestus”.
Code Rida 40: Kui faili ei leita, siis määrame teateks „Faili ei leitud”.
Code Rida 42: Päringu edastamine requestdispatcher objekti abil result.jsp faili koos päringu ja vastuse objektidega.
Tulemus.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>
Koodi selgitus:
Code Rida 10: Siin saame päringuobjekti atribuudi väärtusega gurumessage stringobjekti.
Code Rida 11: Siin me trükime selle sõnumi.
Kui käivitame ülaltoodud koodi, saame järgmise väljundi:
Väljund:
Saame vormi, kus on väljad faili valimiseks kataloogist. Kui fail on valitud, peame klõpsama üleslaadimise nuppu.
Kui oleme klõpsanud üleslaadimisnupul, saame teate, et fail on edukalt üles laaditud.
Alloleval diagrammil näeme, et fail on üles laaditud kausta c:/guru/upload.
JSP-faili allalaadimine
Selles näites laadime faili kataloogist alla, klõpsates nuppu.
Allalaadimine_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>
Koodi selgitus:
Code Rida 10: Siin on link faili allalaadimiseks kaustast c:/guru/upload servleti guru_download abil.
Guru_allalaadimine.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 } }
Koodi selgitus:
Code Rida 3-5: Siin impordime FileInputStreami, IOExceptioni ja Printi.Writer java.io paketist.
Code Rida 15: Me defineerime guru_download faili servett mis laiendab HttpServleti.
Code Rida 18: Nagu me oleme href'i defineerinud, lisatakse see a-sse URL, seega töödeldakse GET-meetodit (servletis kutsutakse välja doGet), mis sisaldab ka päringu- ja vastuseobjekte.
Code Rida 19-20: Me määrame sisutüübi vastuseobjektis ja saame vastusest ka kirjutajaobjekti.
Code Rida 21-22: Muutuja defineerimine gurufile'ina väärtusega test.txt ja gurupath väärtusega c:/guru/upload/.
Code Rida 23-25: Sisutüübi määrame vastuseobjekti abil ja kasutame meetodit setHeader, mis määrab vastuseobjekti päise üleslaaditud failinimena.
Code Rida 27-28: Loome FileInputStreami, kuhu lisame gurupath+gurufile.
Code Rida 31-33: Siin oleme võtnud a samas silmus mis töötab kuni faili lugemiseni, seega oleme andnud tingimuse != -1. Selles tingimuses kirjutame printwriter objekti out abil.
Ülaltoodud koodi käivitamisel saate järgmise väljundi:
Väljund:
Peame klõpsama failil downloading_1.jsp ja me saame hüperlingi nimega „Laadi siit alla“. Sellel hüperlingifailil klõpsamisel laaditakse see süsteemi alla.





