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.






