JSP-filopplasting og nedlasting
⚡ Smart oppsummering
JSP-filopplasting og -nedlasting er sentrale input- og output-operasjoner som lar en webapplikasjon motta filer fra brukere og levere filer tilbake til dem. Denne ressursen forklarer begge flytene ved hjelp av JSP-handlingsskjemaer, Apache Commons FileUpload og servlet-klasser, med fullstendig fungerende kode.

JSP-filopplasting
- Vi kan laste opp alle filer ved hjelp av JSP.
- Det kan være en tekstfil, binær fil, bildefil eller et hvilket som helst annet dokument.
- Her ved filopplasting vil kun POST-metoden brukes og ikke GET-metoden.
- Enctype-attributt bør settes til multipart/form-data.
Eksempel: Bruk av handling
I dette eksemplet laster vi opp en fil ved hjelp av IO-objektet.
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>
Forklaring av koden:
Action_file.jsp
Code Linje 12-18: Her lager vi et skjema med et filfelt, som laster opp en fil til serveren, og handlingen sendes til action_file_upload.jsp.
Action_file_upload.jsp
Code Linje 20: Her gir vi filstien til en bestemt bane.
Code Linje 23-38: Her sjekker vi om innholdstypen er flerdelt/skjema-data. Hvis det er tilfelle, er innholdet av filtypen, og det leses. Etter at filen er lest, skrives den inn i den midlertidige filen, og deretter konverteres den midlertidige filen til hovedfilen.
Når du kjører koden ovenfor, får du følgende utgang:
Utgang:
Vi laster opp en fil ved hjelp av alternativet «velg fil»-knappen, og «last opp fil»-knappen laster opp filen til serveren til den oppgitte banen.
Eksempel: Bruk av JSP-operasjoner
I dette eksemplet skal vi laste opp en fil ved hjelp av JSP-operasjoner. Vi bruker et skjema som har en «last opp»-knapp, og når du klikker på opplastingsknappen, lastes filen opp.
Uploading_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>
Forklaring av koden:
Code Linje 11-12: Her tar vi et skjema som har en handling på servleten guru_upload, som vil gå gjennom en POST-metode. Her spesifiserer også enctype-attributtet hvordan skjemadata skal kodes og sendes til serveren, og det brukes bare med POST-metoden. Her setter vi det som multipart/form-data, som er for filen (siden dataene vil være store).
Code Linje 13: Her spesifiserer vi guru_file-elementet med typen fil og oppgir størrelsen 50.
Code Linje 15: Dette er en send-knapp med navnet «Last opp», som handlingsservleten kalles gjennom, og forespørselen behandles der, og filen leses og skrives inn i servleten.
Guru_opplasting.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); } }
Forklaring av koden:
Code Linje 12-14: Her må vi importere org.apache.commons-biblioteket inn i kodekonfigurasjonen. Vi må importere fileupload-klassen fra org.apache.commons-biblioteket.
Code Linje 23: Her har vi doPost()-metoden, som vil bli kalt når vi sender POST-metoden i JSP, og den vil ta forespørsels- og svarobjekter som parametere.
Code Linje 26: Her oppretter vi et objekt av ServletFileUpload-klassen fra fileUpload-pakken i org.apache.commons-biblioteket, som vil sjekke om det finnes noen filobjekter i JSP. Hvis noen blir funnet, vil disse filobjektene bli hentet fra forespørselen.
Code Linje 27-32: Vi vil iterere over antall filer ved å sjekke hvor mange filelementer som finnes i flerpartsobjektet, som er et listeobjekt (hvis vi laster opp mer enn én fil), og lagre det i c:/guru/upload-mappen med filnavnet som er oppgitt. Vi skriver filen ved hjelp av skrivemetoden til filobjektet inn i mappen som er nevnt.
Code Linje 34: Hvis det ikke er noe unntak, setter vi et attributt i forespørselen som gurumessage med verdien «Filen er lastet opp».
Code Linje 35-36: Hvis det oppstår et unntak, setter vi en melding om at «Filopplasting mislyktes».
Code Linje 40: Hvis filen ikke finnes, setter vi meldingen som «Ingen fil funnet».
Code Linje 42: Videresender forespørselen ved hjelp av requestdispatcher-objektet til result.jsp med request- og response-objekter.
Result.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>
Forklaring av koden:
Code Linje 10: Her henter vi attributtet fra forespørselsobjektet med verdien gurumessage inn i et strengobjekt.
Code Linje 11: Her trykker vi den meldingen.
Når vi kjører koden ovenfor, får vi følgende utgang:
Utgang:
Vi får opp et skjema der det er felt for å velge en fil fra katalogen. Når filen er valgt, må vi klikke på opplastingsknappen.
Når vi klikker på opplastingsknappen, får vi meldingen om at filen er lastet opp.
I diagrammet nedenfor kan vi se at filen ble lastet opp til c:/guru/upload-mappen.
Last ned JSP-fil
I dette eksemplet skal vi laste ned en fil fra en katalog ved å klikke på knappen.
Laster ned_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>
Forklaring av koden:
Code Linje 10: Her har vi gitt en lenke for å laste ned en fil fra mappen c:/guru/upload ved hjelp av servleten 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 } }
Forklaring av koden:
Code Linje 3-5: Her importerer vi FileInputStream, IOException og PrintWriter fra java.io-pakken.
Code Linje 15: Vi definerer guru_download servlett som utvider HttpServlet.
Code Linje 18: Som vi har definert en href, som vil bli omsluttet av en URL, slik at GET-metoden blir behandlet (doGet vil bli kalt i servleten), som også omslutter forespørsels- og svarobjekter.
Code Linje 19-20: Vi angir innholdstypen i response-objektet og henter også writer-objektet fra responsen.
Code Linje 21-22: Definerer en variabel som gurufile med verdien test.txt og gurupath som c:/guru/upload/.
Code Linje 23-25: Vi angir innholdstypen ved hjelp av response-objektet, og vi bruker setHeader-metoden, som setter headeren i response-objektet som filnavnet som er lastet opp.
Code Linje 27-28: Vi lager en FileInputStream der vi legger til gurupath+gurufile.
Code Linje 31-33: Her har vi tatt en mens løkken som vil kjøre til filen er lest, derfor har vi gitt betingelsen som != -1. I denne betingelsen skriver vi ved hjelp av printwriter-objektet out.
Når du kjører koden ovenfor, får du følgende utdata:
Utgang:
Vi må klikke på downloading_1.jsp, og vi vil få opp en hyperkobling som heter «Last ned her». Når du klikker på denne hyperkoblingsfilen, vil den lastes ned til systemet.





