Nahrání a stažení souboru JSP
⚡ Chytré shrnutí
Nahrávání a stahování souborů JSP jsou základní vstupní a výstupní operace, které umožňují webové aplikaci přijímat soubory od uživatelů a poskytovat jim je zpět. Tento zdroj vysvětluje oba postupy pomocí akčních formulářů JSP, Apache Commons FileUpload a tříd servletů s kompletním funkčním kódem.
Nahrání souboru JSP
- Můžeme nahrát libovolné soubory pomocí JSP.
- Může to být textový soubor, binární soubor, soubor obrázku nebo jakýkoli jiný dokument.
- Zde v případě nahrání souboru bude použita pouze metoda POST a nikoli metoda GET.
- Atribut Enctype by měl být nastaven na multipart/form-data.
Příklad: Použití akce
V tomto příkladu nahráváme soubor pomocí objektu IO.
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>
Vysvětlení kódu:
Action_file.jsp
Code Řádek 12–18: Zde vytváříme formulář s polem pro soubor, které nahraje soubor na server a akce bude předána souboru action_file_upload.jsp.
Action_file_upload.jsp
Code Řádek 20: Zde zadáváme cestu k souboru na konkrétní cestu.
Code Řádek 23–38: Zde kontrolujeme, zda je typ obsahu multipart/form-data. Pokud ano, pak je obsah typu soubor a je přečten. Po přečtení souboru je zapsán do dočasného souboru a poté je dočasný soubor převeden do hlavního souboru.
Když spustíte výše uvedený kód, získáte následující výstup:
Výstup:
Soubor nahráváme pomocí tlačítka pro výběr souboru a tlačítko pro nahrání souboru nahraje soubor na server do zadané cesty.
Příklad: Použití operací JSP
V tomto příkladu nahrajeme soubor pomocí JSP operací. Vezmeme si formulář, který bude mít tlačítko „nahrát“ a po kliknutí na tlačítko nahrát se soubor nahraje.
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>
Vysvětlení kódu:
Code Řádek 11–12: Zde bereme formulář, který má akci na servletu guru_upload, která bude procházet metodou POST. Atribut enctype zde také určuje, jak mají být data formuláře kódována a odeslána na server, a používá se pouze s metodou POST. Zde jej nastavujeme jako multipart/form-data, což je pro soubor (protože data budou velká).
Code Řádek 13: Zde specifikujeme element guru_file s typem file a jeho velikostí 50.
Code Řádek 15: Toto je tlačítko typu odeslání s názvem „Nahrát“, jehož prostřednictvím bude volána akce servletu, požadavek bude do něj zpracován a soubor bude přečten a zapsán do servletu.
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); } }
Vysvětlení kódu:
Code Řádek 12–14: Zde budeme muset importovat knihovnu org.apache.commons do konfigurace kódu. Z knihovny org.apache.commons budeme muset importovat třídu fileupload.
Code Řádek 23: Zde máme metodu doPost(), která bude volána při předávání metody POST v JSP a jako parametry bude přijímat objekty request a response.
Code Řádek 26: Zde vytváříme objekt třídy ServletFileUpload z balíčku fileUpload knihovny org.apache.commons, který zkontroluje, zda se v JSP nacházejí nějaké souborové objekty. Pokud nějaké naleznou, budou tyto souborové objekty z požadavku převzaty.
Code Řádek 27–32: Budeme iterovat nad počtem souborů kontrolou, kolik položek souboru se nachází v objektu multiparts, což je objekt typu list (pokud nahráváme více než jeden soubor), a uložíme jej do složky c:/guru/upload s názvem souboru, který byl zadán. Soubor zapíšeme pomocí metody write objektu file do zmíněné složky.
Code Řádek 34: Pokud neexistuje žádná výjimka, nastavujeme v požadavku atribut gurumessage s hodnotou „Soubor byl úspěšně nahrán“.
Code Řádek 35–36: Pokud dojde k výjimce, nastavíme zprávu „Nahrávání souboru se nezdařilo“.
Code Řádek 40: Pokud soubor není nalezen, nastavíme zprávu „Nenalezen žádný soubor“.
Code Řádek 42: Přeposlání požadavku pomocí objektu requestdispatcher do result.jsp s objekty request a response.
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>
Vysvětlení kódu:
Code Řádek 10: Zde získáváme atribut z objektu požadavku s hodnotou gurumessage do objektu typu String.
Code Řádek 11: Zde tiskneme tuto zprávu.
Když spustíme výše uvedený kód, dostaneme následující výstup:
Výstup:
Dostaneme formulář, ve kterém jsou pole pro výběr souboru z adresáře. Jakmile je soubor vybrán, musíme kliknout na tlačítko pro nahrání.
Po kliknutí na tlačítko pro nahrání se nám zobrazí zpráva, že soubor byl úspěšně nahrán.
Na níže uvedeném diagramu vidíme, že soubor byl nahrán do složky c:/guru/upload.
Stažení souboru JSP
V tomto příkladu stáhneme soubor z adresáře kliknutím na tlačítko.
Stahování_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>
Vysvětlení kódu:
Code Řádek 10: Zde uvádíme odkaz pro stažení souboru ze složky c:/guru/upload pomocí servletu 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 } }
Vysvětlení kódu:
Code Řádek 3–5: Zde importujeme FileInputStream, IOException a Print.Writer z balíčku java.io.
Code Řádek 15: Definujeme guru_download. servlet který rozšiřuje HttpServlet.
Code Řádek 18: Jak jsme definovali href, který bude uzavřen v URL, takže bude zpracována metoda GET (v servletu bude volána metoda doGet), která také uzavírá objekty požadavku a odpovědi.
Code Řádek 19–20: V objektu odpovědi nastavujeme typ obsahu a z odpovědi také získáváme objekt zapisovače.
Code Řádek 21–22: Definování proměnné jako gurufile s hodnotou test.txt a gurupath jako c:/guru/upload/.
Code Řádek 23–25: Typ obsahu nastavujeme pomocí objektu response a používáme metodu setHeader, která nastaví hlavičku do objektu response jako název nahraného souboru.
Code Řádek 27–28: Vytváříme FileInputStream, do kterého přidáme gurupath+gurufile.
Code Řádek 31–33: Zde jsme vzali a zatímco smyčka který bude běžet, dokud nebude soubor přečten, proto jsme zadali podmínku jako != -1. V této podmínce zapisujeme pomocí objektu printwriter.
Po spuštění výše uvedeného kódu získáte následující výstup:
Výstup:
Musíme kliknout na soubor downloading_1.jsp a zobrazí se nám hypertextový odkaz „Stáhnout zde“. Po kliknutí na tento hypertextový odkaz se soubor stáhne do systému.






