JSP-fil upload og download
⚡ Smart opsummering
JSP-filupload og -download er centrale input- og output-operationer, der giver en webapplikation mulighed for at modtage filer fra brugere og sende filer tilbage til dem. Denne ressource forklarer begge flows ved hjælp af JSP-handlingsformularer, Apache Commons FileUpload og servlet-klasser med komplet fungerende kode.

JSP fil upload
- Vi kan uploade alle filer ved hjælp af JSP.
- Det kan være en tekstfil, binær fil, billedfil eller et hvilket som helst andet dokument.
- Her i tilfælde af filupload vil kun POST-metoden blive brugt og ikke GET-metoden.
- Enctype-attribut skal indstilles til multipart/form-data.
Eksempel: Brug af handling
I dette eksempel uploader vi en fil ved hjælp af et IO-objekt.
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 af koden:
Action_file.jsp
Code Linje 12-18: Her opretter vi en formular med et filfelt, som vil uploade en fil til serveren, og handlingen vil blive sendt til action_file_upload.jsp.
Action_file_upload.jsp
Code Linje 20: Her angiver vi filstien til en bestemt sti.
Code Linje 23-38: Her kontrollerer vi, om indholdstypen er multipart/form-data. Hvis det er tilfældet, er indholdet af filtypen, og det læses. Når filen er læst, skrives den til den midlertidige fil, og derefter konverteres den midlertidige fil til hovedfilen.
Når du udfører ovenstående kode, får du følgende output:
Output:
Vi uploader en fil ved hjælp af knappen "Vælg fil", og knappen "Upload fil" uploader filen til serveren til den angivne sti.
Eksempel: Brug af JSP-operationer
I dette eksempel skal vi uploade en fil ved hjælp af JSP-operationer. Vi bruger en formular med en "upload"-knap, og når du klikker på upload-knappen, bliver filen uploadet.
Uploader_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 af koden:
Code Linje 11-12: Her tager vi en formular, der har en handling på servlet'en guru_upload, som vil passere gennem en POST-metode. Her specificerer attributten enctype også, hvordan formulardata skal kodes og sendes til serveren, og den bruges kun med POST-metoden. Her indstiller vi den som multipart/form-data, hvilket er for filen (da dataene vil være store).
Code Linje 13: Her angiver vi guru_file-elementet med typen file og angiver størrelsen 50.
Code Linje 15: Dette er en send-knap med navnet "Upload", hvorigennem handlingsservlet'en kaldes, anmodningen behandles i den, og filen læses og skrives til servlet'en.
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); } }
Forklaring af koden:
Code Linje 12-14: Her skal vi importere org.apache.commons-biblioteket ind i kodekonfigurationen. Vi skal importere fileupload-klassen fra org.apache.commons-biblioteket.
Code Linje 23: Her har vi doPost()-metoden, som kaldes, når vi sender POST-metoden i JSP, og den tager request- og response-objekter som parametre.
Code Linje 26: Her opretter vi et objekt af ServletFileUpload-klassen fra fileUpload-pakken i org.apache.commons-biblioteket, som vil kontrollere, om der er nogen filobjekter i JSP. Hvis der findes nogen, vil disse filobjekter blive taget fra anmodningen.
Code Linje 27-32: Vi vil iterere over antallet af filer ved at kontrollere, hvor mange filelementer der er til stede i multiparts-objektet, som er et listeobjekt (hvis vi uploader mere end én fil), og gemme det i c:/guru/upload-mappen med det angivne filnavn. Vi skriver filen ved hjælp af skrivemetoden for file-objektet til den nævnte mappe.
Code Linje 34: Hvis der ikke er nogen undtagelse, sætter vi en attribut i anmodningen som gurumessage med værdien "Filen er uploadet".
Code Linje 35-36: Hvis der opstår en undtagelse, viser vi en meddelelse om, at "Filupload mislykkedes".
Code Linje 40: Hvis filen ikke findes, sætter vi meddelelsen til "Ingen fil fundet".
Code Linje 42: Videresendelse af anmodningen ved hjælp af 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 af koden:
Code Linje 10: Her henter vi attributten fra request-objektet med værdien gurumessage ind i et strengobjekt.
Code Linje 11: Her udskriver vi den besked.
Når vi udfører ovenstående kode, får vi følgende output:
Output:
Vi får en formular, hvor der er felter til at vælge en fil fra mappen. Når filen er valgt, skal vi klikke på upload-knappen.
Når vi klikker på upload-knappen, får vi beskeden om, at filen er uploadet.
I diagrammet nedenfor kan vi se, at filen er blevet uploadet til mappen c:/guru/upload.
Download JSP fil
I dette eksempel skal vi downloade en fil fra en mappe ved at klikke på knappen.
Downloader_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 af koden:
Code Linje 10: Her har vi givet et link til at downloade en fil fra mappen c:/guru/upload ved hjælp af servlet'en 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 af koden:
Code Linje 3-5: Her importerer vi FileInputStream, IOException og PrintWriter fra java.io-pakken.
Code Linje 15: Vi definerer guru_download servlet som udvider HttpServlet.
Code Linje 18: Som vi har defineret en href, som vil være omsluttet af en URL, så GET-metoden vil blive behandlet (doGet vil blive kaldt i servlet'en), som også omslutter anmodnings- og svarobjekter.
Code Linje 19-20: Vi indstiller indholdstypen i response-objektet og henter også writer-objektet fra responsen.
Code Linje 21-22: Definering af en variabel som gurufile med værdien test.txt og gurupath som c:/guru/upload/.
Code Linje 23-25: Vi indstiller indholdstypen ved hjælp af response-objektet, og vi bruger setHeader-metoden, som indstiller headeren i response-objektet som det filnavn, der er blevet uploadet.
Code Linje 27-28: Vi opretter en FileInputStream, hvor vi vil tilføje gurupath+gurufile.
Code Linje 31-33: Her har vi taget en mens løkke som vil køre indtil filen er læst, derfor har vi givet betingelsen != -1. I denne betingelse skriver vi ved hjælp af printwriter-objektet out.
Når du udfører ovenstående kode, får du følgende output:
Output:
Vi skal klikke på downloading_1.jsp, og vi får et hyperlink som "Download her". Når du klikker på denne hyperlinkfil, downloades den til systemet.





