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.

  • 📤 Základy nahrávání: Použijte metodu POST a nastavte enctype na multipart/form-data pro jakékoli nahrávání souborů.
  • 🧩 Apache Commons: Metody DiskFileItemFactory a ServletFileUpload analyzují vícedílný požadavek na položky souboru.
  • 🗂️ Zpracování servletů: Metoda doPost iteruje položky souboru a každou z nich zapisuje do cílové složky.
  • 📥 Postup stahování: Servlet streamuje soubor pomocí FileInputStream a záhlaví Content-Disposition.
  • ⚙️ Konfigurace: Před čtením nebo zápisem je nutné nastavit cesty k souborům, limity velikosti a typ obsahu.

Nahrání a stažení souboru JSP

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:

Nahrání souboru JSP

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í.

Nahrání souboru pomocí operací JSP

Po kliknutí na tlačítko pro nahrání se nám zobrazí zpráva, že soubor byl úspěšně nahrán.

Nahrání souboru pomocí operací JSP

Na níže uvedeném diagramu vidíme, že soubor byl nahrán do složky c:/guru/upload.

Nahrání souboru pomocí operací JSP

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:

Stahování souboru

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.

Nejčastější dotazy

Ano. Asistenti s umělou inteligencí mohou vytvářet scaffoldy servletů a JSP formulářů pro nahrávání a stahování souborů, přidávat logiku Apache Commons FileUpload a navrhovat validaci. Přesto byste měli otestovat kód a zkontrolovat cesty k souborům a limity velikosti.

Ano. Skenery založené na umělé inteligenci dokáží nahrané soubory před dosažením úložiště zkontrolovat, zda neobsahují malware, neočekávané typy nebo nadměrně velké datové části. To přidává vrstvu ochrany, ačkoli ověření typu a velikosti na straně serveru zůstává zásadní.

Kódování multipart/form-data rozděluje požadavek na části, takže binární data souboru jsou transmitted neporušený. Bez něj prohlížeč odešle na server pouze název souboru, nikoli jeho skutečný obsah.

Apache Commons FileUpload je spolu s Commons IO široce používán. Analyzuje vícedílné požadavky, zpřístupňuje každou položku souboru (FileItem) a zapisuje nahraný obsah do vybraného adresáře na serveru.

Shrňte tento příspěvek takto: