Nahrání a stažení souboru JSP

V tomto příkladu se budeme učit o nahrávání a stahování souboru prostřednictvím JSP.

Vstup souboru výstup jsou velmi důležité operace. Zde budeme číst a zapisovat soubor pomocí 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í IO objektu

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

Řádek 12–18 kódu: Zde vytváříme formulář s polem souboru, který nahraje soubor na server a akce bude předána na action_file_upload.jsp

Action_file_upload.jsp

20. řádek kódu: Zde dáváme cestu k souboru konkrétní cestě

Řádek 23–38 kódu: Zde zkontrolujeme, zda je typ obsahu multipart/form-data. Pokud tomu tak je, pak je obsah typu souboru a je přečten. Po načtení souboru se zapíše do dočasného souboru a poté se dočasný soubor převede na hlavní soubor.

Když spustíte výše uvedený kód, získáte následující výstup

Nahrání souboru JSP

Výstup:

Nahráváme soubor pomocí možnosti tlačítka vybrat soubor a tlačítko nahrát soubor nahraje soubor na server na zadanou cestu.

Příklad: Použití operací JSP

V tomto příkladu nahrajeme soubor pomocí operací JSP. Vezmeme formulář, který bude mít tlačítko „nahrát“ a když kliknete na tlačítko nahrát, soubor se 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:

Řádek 11–12 kódu: Zde bereme formulář, který má akci na servlet guru_upload, který projde metodou POST. Také zde uvádíme enctype, tj. atribut, který určuje, jak mají být data formuláře zakódována a odeslána na server a používá se pouze s metodou POST. Zde nastavujeme jako multipart/form-data, která jsou pro soubor (protože data budou velká).

13. řádek kódu: Zde určujeme prvek guru_file s typem souboru a velikostí je 50.

15. řádek kódu: Jedná se o tlačítko typu odeslat s názvem „Nahrát“, přes které bude vyvolána akce servletu a do něj bude zpracován požadavek a soubor bude nač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:

Řádek 12–14 kódu: Zde budeme muset importovat knihovnu org.apache.commons do konfigurace kódu. Budeme muset importovat třídu fileupload z knihovny org.apache.commons.

23. řádek kódu: Zde máme metodu doPost(), která bude volána, když předáváme metodu POST v JSP, a jako své parametry bude požadovat a odpovídat na objekty.

26. řádek kódu: Zde vytváříme objekt třídy ServletFileUpload z balíčku fileUpload z knihovny org.apache.commons, který zkontroluje, zda jsou v JSP nějaké souborové objekty. Pokud je nějaký nalezen, budou tyto objekty souboru odebrány z požadavku.

Řádek 27–32 kódu: Budeme opakovat počet souborů tak, že zkontrolujeme, kolik položek souboru je přítomno ve vícedílném objektu, který je objektem seznamu (pokud nahrajeme více než jeden soubor) a uložíme jej do složky c:/guru/upload s poskytnutým názvem souboru. . Soubor zapisujeme pomocí metody write objektu fileobject do složky, která byla zmíněna.

34. řádek kódu: Pokud neexistuje žádná výjimka, nastavíme atribut v požadavku jako gurumessage s hodnotou „Soubor úspěšně nahrán“.

Řádek 35–36 kódu: Pokud dojde k výjimce, nastavte zprávu, že „Nahrávání souboru se nezdařilo“

40. řádek kódu: Pokud soubor nebyl nalezen, nastavte zprávu jako „Nebyl nalezen žádný soubor“

42. řádek kódu: Předávání požadavku pomocí objektu requestdispatcher do result.jsp s objekty požadavku a odpovědi.

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:

10. řádek kódu: Zde získáváme atribut z objektu požadavku s hodnotou gurumessage do objektu typu string.

Řádek 11 kódu: Zde tiskneme tuto zprávu.

Když provedeme výše uvedený kód, dostaneme následující výstup

Výstup:

Dostaneme formulář, kde jsou pole pro výběr souboru z adresáře. Jakmile je soubor vybrán, musíme kliknout na tlačítko nahrát.

Nahrání souboru pomocí operací JSP

Po kliknutí na tlačítko nahrávání se 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:

10. řádek kódu: Zde jsme dali odkaz ke 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:

Řádek 3–5 kódu: Zde importujeme FileInputStream , IO Exception a PrintWriter z balíčku java.io.

15. řádek kódu: Definujeme guru_download servlet který rozšiřuje HttpServlet.

18. řádek kódu: Protože jsme definovali href, který bude uzavřen v URL, bude zpracována metoda GET (v servletu bude volána doGet), která také uzavře objekty request a response.

Řádek 19–20 kódu: Nastavujeme typ obsahu v objektu odpovědi a také získáváme objekt Writer z odpovědi.

Řádek 21–22 kódu: Definování proměnné jako gurufile jako hodnota test.txt a gurupath jako c:/guru/upload/

Řádek 23–25 kódu: Typ obsahu nastavujeme pomocí objektu odpovědi a používáme metodu setHeader, která nastavuje záhlaví do objektu odpovědi jako název souboru, který byl nahrán.

Řádek 27–28 kódu: Vytváříme FileInputStream, do kterého přidáme gurupath+gurufile.

Řádek 31–33 kódu: Zde jsme vzali a zatímco smyčka který poběží, dokud se soubor nepřečte, proto jsme zadali podmínku jako != -1. V tomto stavu zapisujeme pomocí objektu printwriter out.

Po provedení výše uvedeného kódu získáte následující výstup

Výstup:

Stahování souboru

Výstup:

Musíme kliknout na downloading_1.jsp, dostaneme hypertextový odkaz jako „Stáhnout zde“. Když kliknete na tento hypertextový soubor, stáhne se do systému.

Shrnutí

  • Dozvěděli jsme se o registračním formuláři pro registraci do jakékoli aplikace
  • Zjistěte více o tom, jak fungují přihlašovací a odhlašovací formuláře.
  • Také se dozvěděli o nahrávání a stahování souboru prostřednictvím JSP.