Ladda upp och ladda ner JSP-filer
โก Smart sammanfattning
JSP-filuppladdning och -nedladdning รคr centrala in- och utdataoperationer som lรฅter en webbapplikation ta emot filer frรฅn anvรคndare och skicka filer tillbaka till dem. Den hรคr resursen fรถrklarar bรฅda flรถdena med hjรคlp av JSP-รฅtgรคrdsformulรคr, Apache Commons FileUpload och servletklasser, med fullstรคndig fungerande kod.

JSP-filuppladdning
- Vi kan ladda upp alla filer med JSP.
- Det kan vara en textfil, binรคr fil, bildfil eller nรฅgot annat dokument.
- Hรคr vid filuppladdning kommer endast POST-metoden att anvรคndas och inte GET-metoden.
- Enctype-attribut ska stรคllas in pรฅ multipart/form-data.
Exempel: Anvรคnda Action
I det hรคr exemplet laddar vi upp en fil med hjรคlp 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>
Fรถrklaring av koden:
Action_file.jsp
Code Rad 12-18: Hรคr skapar vi ett formulรคr med ett filfรคlt, som laddar upp en fil till servern, och รฅtgรคrden skickas till action_file_upload.jsp.
Action_file_upload.jsp
Code Linje 20: Hรคr anger vi filsรถkvรคgen till en specifik sรถkvรคg.
Code Rad 23-38: Hรคr kontrollerar vi om innehรฅllstypen รคr multipart/form-data. Om sรฅ รคr fallet รคr innehรฅllet av filtypen och det lรคses. Efter att filen har lรคsts skrivs den till den temporรคra filen, och sedan konverteras den temporรคra filen till huvudfilen.
Nรคr du kรถr ovanstรฅende kod fรฅr du fรถljande utdata:
Produktion:
Vi laddar upp en fil med hjรคlp av alternativet "vรคlj fil", och knappen "uppladda fil" laddar upp filen till servern till den angivna sรถkvรคgen.
Exempel: Anvรคnda JSP-operationer
I det hรคr exemplet ska vi ladda upp en fil med hjรคlp av JSP-operationer. Vi anvรคnder ett formulรคr som har en "uppladdningsknapp", och nรคr du klickar pรฅ uppladdningsknappen laddas filen upp.
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>
Fรถrklaring av koden:
Code Rad 11-12: Hรคr tar vi ett formulรคr som har en รฅtgรคrd pรฅ servleten guru_upload, som kommer att passera genom en POST-metod. Attributet enctype anger ocksรฅ hรคr hur formulรคrdata ska kodas och skickas till servern, och det anvรคnds endast med POST-metoden. Hรคr stรคller vi in โโdet som multipart/form-data, vilket รคr fรถr filen (eftersom datamรคngden kommer att vara stor).
Code Linje 13: Hรคr anger vi guru_file-elementet med typen file och anger storleken 50.
Code Linje 15: Detta รคr en knapp av typen "Skicka" med namnet "Ladda upp", genom vilken รฅtgรคrdsservleten anropas och begรคran bearbetas till den, och filen lรคses och skrivs till servleten.
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); } }
Fรถrklaring av koden:
Code Rad 12-14: Hรคr mรฅste vi importera org.apache.commons-biblioteket till koden. Vi mรฅste importera fileupload-klassen frรฅn org.apache.commons-biblioteket.
Code Linje 23: Hรคr har vi doPost()-metoden, som kommer att anropas nรคr vi skickar POST-metoden i JSP, och den kommer att ta request- och response-objekt som sina parametrar.
Code Linje 26: Hรคr skapar vi ett objekt i ServletFileUpload-klassen frรฅn fileUpload-paketet i org.apache.commons-biblioteket, vilket kontrollerar om det finns nรฅgra filobjekt i JSP. Om nรฅgra hittas kommer dessa filobjekt att hรคmtas frรฅn begรคran.
Code Rad 27-32: Vi kommer att iterera รถver antalet filer genom att kontrollera hur mรฅnga filelement som finns i multipartsobjektet, vilket รคr ett listobjekt (om vi laddar upp mer รคn en fil), och spara det i mappen c:/guru/upload med det angivna filnamnet. Vi skriver filen med hjรคlp av write-metoden fรถr filobjektet till mappen som har nรคmnts.
Code Linje 34: Om det inte finns nรฅgot undantag, sรฅ stรคller vi in โโett attribut i fรถrfrรฅgan som gurumessage med vรคrdet "Filen laddades upp framgรฅngsrikt".
Code Rad 35-36: Om ett undantag intrรคffar visas meddelandet โFiluppladdning misslyckadesโ.
Code Linje 40: Om filen inte hittas stรคller vi in โโmeddelandet som "Ingen fil hittad".
Code Linje 42: Vidarebefordrar begรคran med hjรคlp av requestdispatcher-objektet till result.jsp med request- och response-objekten.
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>
Fรถrklaring av koden:
Code Linje 10: Hรคr hรคmtar vi attributet frรฅn request-objektet med vรคrdet gurumessage till ett strรคngobjekt.
Code Linje 11: Hรคr skriver vi ut meddelandet.
Nรคr vi kรถr ovanstรฅende kod fรฅr vi fรถljande utdata:
Produktion:
Vi fรฅr upp ett formulรคr dรคr det finns fรคlt fรถr att vรคlja en fil frรฅn katalogen. Nรคr filen รคr vald mรฅste vi klicka pรฅ uppladdningsknappen.
Nรคr vi klickar pรฅ uppladdningsknappen fรฅr vi meddelandet att filen har laddats upp.
I diagrammet nedan kan vi se att filen har laddats upp till mappen c:/guru/upload.
Ladda ner JSP-fil
I det hรคr exemplet ska vi ladda ner en fil frรฅn en katalog genom att klicka pรฅ knappen.
Laddar 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>
Fรถrklaring av koden:
Code Linje 10: Hรคr har vi gett en lรคnk fรถr att ladda ner en fil frรฅn mappen c:/guru/upload med hjรคlp 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 } }
Fรถrklaring av koden:
Code Rad 3-5: Hรคr importerar vi FileInputStream, IOException och PrintWriter frรฅn java.io-paketet.
Code Linje 15: Vi definierar guru_download servlett som fรถrlรคnger HttpServlet.
Code Linje 18: Som vi har definierat en href, som kommer att omslutas av en URL, sรฅ GET-metoden kommer att bearbetas (doGet kommer att anropas i servleten), som ocksรฅ omsluter request- och response-objekt.
Code Rad 19-20: Vi anger innehรฅllstypen i svarsobjektet och hรคmtar รคven writer-objektet frรฅn svaret.
Code Rad 21-22: Definiera en variabel som gurufile med vรคrdet test.txt och gurupath som c:/guru/upload/.
Code Rad 23-25: Vi stรคller in innehรฅllstypen med hjรคlp av response-objektet och vi anvรคnder setHeader-metoden, som stรคller in headern i response-objektet som filnamnet som har laddats upp.
Code Rad 27-28: Vi skapar en FileInputStream dรคr vi kommer att lรคgga till gurupath+gurufile.
Code Rad 31-33: Hรคr har vi tagit en medan slingan vilket kommer att kรถras tills filen รคr lรคst, dรคrfรถr har vi angett villkoret != -1. I detta villkor skriver vi med hjรคlp av printwriter-objektet out.
Nรคr du kรถr ovanstรฅende kod fรฅr du fรถljande utdata:
Produktion:
Vi mรฅste klicka pรฅ downloading_1.jsp, sรฅ fรฅr vi upp en hyperlรคnk som heter "Ladda ner hรคr". Nรคr du klickar pรฅ hyperlรคnkfilen laddas den ner till systemet.





