JSP-bestand uploaden en downloaden
In dit voorbeeld gaan we leren over het uploaden en downloaden van een bestand via JSP.
Bestand Input output zijn zeer belangrijke bewerkingen. Hier gaan we een bestand lezen en schrijven met behulp van JSP.
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
Coderegel 12-18: Hier maken we een formulier met een bestandsveld, waarmee het bestand naar de server wordt geüpload en de actie wordt doorgegeven aan action_file_upload.jsp
Action_file_upload.jsp
Coderegel 20: Hier geven we het bestandspad naar een bepaald pad
Coderegel 23-38: Hier controleren we of het inhoudstype multipart/form-data is. Als dat het geval is, is de inhoud van het bestandstype en wordt deze gelezen. Nadat het bestand is gelezen, wordt het naar het tijdelijke bestand geschreven en vervolgens wordt het tijdelijke bestand geconverteerd naar het hoofdbestand.
Wanneer u de bovenstaande code uitvoert, krijgt u de volgende uitvoer
Output:
We uploaden het bestand met behulp van de bestandsknopoptie en de uploadbestandsknop uploadt het bestand naar de server volgens het opgegeven pad.
Voorbeeld: JSP-bewerkingen gebruiken
In dit voorbeeld gaan we een bestand uploaden met behulp van JSP-bewerkingen. We nemen een formulier met een "upload"-knop en wanneer u op de upload-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:
Coderegel 11-12: Hier nemen we een formulier dat actie heeft op servlet guru_upload die via een methode POST zal gaan. Ook gebruiken we hier enctype ie attribuut dat specificeert hoe formuliergegevens gecodeerd en naar de server verzonden moeten worden en het wordt alleen gebruikt met de POST-methode. Hier stellen we in als multipart/form-data wat voor het bestand is (aangezien de gegevens groot zullen zijn).
Coderegel 13: Hier specificeren we het guru_file-element met typebestand en geven we de grootte op 50.
Coderegel 15: Dit is een knop van het verzendtype met de naam 'Uploaden' waarmee de actieservlet wordt aangeroepen en het verzoek daarin wordt verwerkt en het bestand wordt gelezen en geschreven in de servlet.
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:
Coderegel 12-14: Hier zullen we de org.apache.commons-bibliotheek in de configuratie van de code moeten importeren. We zullen de fileupload-klasse uit de org.apache.commons-bibliotheek moeten importeren.
Coderegel 23: Hier hebben we de doPost()-methode, die zal worden aangeroepen als we de POST-methode in JSP doorgeven en deze zal objecten als parameters opvragen en beantwoorden
Coderegel 26: Hier maken we een object van de klasse ServletFileUpload uit het fileUpload-pakket uit de bibliotheek org.apache.commons, dat zal controleren of er bestandsobjecten in JSP zijn. Als er iets wordt gevonden, wordt dat bestandsobject uit het verzoek gehaald.
Coderegel 27-32: We zullen het aantal bestanden herhalen door te controleren hoeveel bestandsitems er aanwezig zijn in een multiparts-object dat een lijstobject is (als we meer dan één bestand uploaden) en het opslaan in de map c:/guru/upload met de bestandsnaam die is opgegeven . We schrijven het bestand met behulp van de schrijfmethode van het bestandsobject naar de genoemde map.
Coderegel 34: Als er geen uitzondering is, stellen we het attribuut in het verzoek in als gurumessage met de waarde 'Bestand succesvol geüpload'.
Coderegel 35-36: Als er een uitzondering optreedt, wordt het bericht 'Bestandsupload mislukt' ingesteld
Coderegel 40: Als het bestand niet gevonden wordt, stel dan het bericht in als “Geen bestand gevonden”
Coderegel 42: Aanvraag doorsturen met requestdispatcher-object naar result.jsp met aanvraag- en responsobjecten.
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:
Coderegel 10: Hier halen we het attribuut van het request-object met waarde gurumessage naar een string-object.
Coderegel 11: Hier drukken we dat bericht af.
Wanneer we de bovenstaande code uitvoeren, krijgen we de volgende uitvoer
Output:
We krijgen een formulier met velden waarin u een bestand uit de map kunt kiezen. Zodra het bestand is geselecteerd, moeten we op de uploadknop klikken.
Zodra op de uploadknop wordt geklikt, krijgen we de melding dat het bestand succesvol is geüpload.
In het onderstaande diagram kunnen we zien dat het bestand is geüpload naar de map c:/guru/upload.
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:
Coderegel 10: Hier hebben we een link gegeven om een bestand te downloaden uit de map c:/guru/upload met behulp van 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:
Coderegel 3-5: Hier importeren we FileInputStream, IO Exception en PrintWriter uit het java.io-pakket.
Coderegel 15: We definiëren guru_download servet die HttpServlet uitbreidt.
Coderegel 18: Omdat we een href hebben gedefinieerd, die in de URL zal worden ingesloten, wordt de GET-methode verwerkt (doGet wordt aangeroepen in de servlet), die ook verzoek- en antwoordobjecten bevat.
Coderegel 19-20: We stellen de inhoud in. Typ het antwoordobject in en haal ook het schrijverobject uit het antwoord.
Coderegel 21-22: Een variabele definiëren als gurufile als waarde test.txt en gurupath als c:/guru/upload/
Coderegel 23-25: We stellen het inhoudstype in met behulp van het responsobject en we gebruiken de setHeader-methode die de header in het responsobject instelt als de bestandsnaam die is geüpload.
Coderegel 27-28: We maken FileInputStream waarin we gurupath+gurufile toevoegen.
Coderegel 31-33: Hier hebben we een genomen herhalingslus die loopt totdat het bestand is gelezen, daarom hebben we de voorwaarde opgegeven als != -1. In deze toestand schrijven we met behulp van printwriter-object uit.
Wanneer u de bovenstaande code uitvoert, krijgt u de volgende uitvoer
Output:
Output:
We moeten op downloaden_1.jsp klikken en we krijgen een hyperlink als "Download hier". Wanneer u op dit hyperlinkbestand klikt, wordt het naar het systeem gedownload.
Samenvatting
- We hebben geleerd over het registratieformulier waarmee u zich voor elke toepassing kunt registreren
- Meer informatie over hoe de in- en uitlogformulieren werken.
- Ook geleerd over het uploaden en downloaden van een bestand via JSP.