Przesyłanie i pobieranie plików JSP

W tym przykładzie dowiemy się o przesyłaniu i pobieraniu pliku za pośrednictwem JSP.

Operacje wejścia i wyjścia pliku są bardzo ważne. Tutaj będziemy czytać i zapisywać plik za pomocą JSP.

Przesyłanie pliku JSP

  • Możemy przesłać dowolne pliki za pomocą JSP.
  • Może to być plik tekstowy, plik binarny, plik obrazu lub dowolny inny dokument.
  • Tutaj w przypadku przesyłania pliku zostanie użyta tylko metoda POST, a nie metoda GET.
  • Atrybut Enctype powinien być ustawiony na multipart/form-data.

Przykład: użycie akcji

W tym przykładzie przesyłamy plik za pomocą obiektu IO

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

Wyjaśnienie kodu:

Plik_akcji.jsp

Linia kodu 12-18: Tutaj tworzymy formularz z polem pliku, który wgra plik na serwer, a akcja zostanie przekazana do action_file_upload.jsp

Action_file_upload.jsp

Linia kodu 20: Tutaj podajemy ścieżkę pliku do określonej ścieżki

Linia kodu 23-38: Tutaj sprawdzamy, czy typ zawartości to multipart/form-data. W takim przypadku zawartość jest typu pliku i jest odczytywana. Po wczytaniu pliku jest on zapisywany w pliku tymczasowym, a następnie plik tymczasowy jest konwertowany do pliku głównego.

Po wykonaniu powyższego kodu otrzymasz następujący wynik

Przesyłanie pliku JSP

Wyjście:

Przesyłamy plik za pomocą przycisku wyboru pliku, a przycisk przesyłania pliku prześle plik na serwer do podanej ścieżki.

Przykład: Korzystanie z operacji JSP

W tym przykładzie prześlemy plik za pomocą operacji JSP. Weźmiemy formularz, który będzie miał przycisk „upload” i po kliknięciu przycisku upload plik zostanie przesłany.

Przesyłanie_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>

Wyjaśnienie kodu:

Linia kodu 11-12: Tutaj bierzemy formularz, który ma działanie na servlet guru_upload, które przejdzie przez metodę POST. Tutaj również enctype atrybut ie, który określa, jak dane formularza powinny być kodowane i wysyłane do serwera i jest używany tylko z metodą POST. Tutaj ustawiamy jako multipart/form-data, co jest dla pliku (ponieważ dane będą duże).

Linia kodu 13: Tutaj określamy element guru_file z typem pliku i podajemy rozmiar jako 50.

Linia kodu 15: Jest to przycisk typu wysyłania o nazwie „Prześlij”, za pomocą którego zostanie wywołany serwlet akcji, żądanie zostanie w nim przetworzone, a plik zostanie odczytany i zapisany w serwlecie.

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);
		
		    }


}

Wyjaśnienie kodu:

Linia kodu 12-14: Tutaj będziemy musieli zaimportować bibliotekę org.apache.commons do konfiguracji kodu. Będziemy musieli zaimportować klasę fileupload z biblioteki org.apache.commons.

Linia kodu 23: Tutaj mamy metodę doPost(), która zostanie wywołana podczas przekazywania metody POST w JSP i będzie żądać i odpowiadać obiektami jako swoimi parametrami

Linia kodu 26: Tutaj tworzymy obiekt klasy ServletFileUpload z pakietu fileUpload z biblioteki org.apache.commons, który sprawdzi, czy w JSP znajdują się jakieś obiekty plikowe. Jeśli jakiś zostanie znaleziony, obiekt pliku zostanie pobrany z żądania.

Linia kodu 27-32: Będziemy iterować liczbę plików, sprawdzając, ile elementów plików znajduje się w obiekcie multiparts, który jest obiektem listy (jeśli przesyłamy więcej niż jeden plik) i zapiszemy go w folderze c:/guru/upload z podaną nazwą pliku . Zapisujemy plik metodą write obiektu file do wspomnianego folderu.

Linia kodu 34: Jeśli nie ma wyjątku, ustawiamy atrybut w żądaniu jako gurumessage o wartości „Plik przesłany pomyślnie”.

Linia kodu 35-36: Jeśli wystąpi wyjątek, wówczas ustawienie komunikatu „Przesyłanie pliku nie powiodło się”

Linia kodu 40: Jeśli plik nie został znaleziony, ustawienie komunikatu jako „Nie znaleziono pliku”

Linia kodu 42: Przekazywanie żądania przy użyciu obiektu requestdispatcher do pliku wynik.jsp z obiektami żądania i odpowiedzi.

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

Wyjaśnienie kodu:

Linia kodu 10: Tutaj pobieramy atrybut z obiektu żądania o wartości gurumessage do obiektu typu string.

Linia kodu 11: Tutaj drukujemy tę wiadomość.

Po wykonaniu powyższego kodu otrzymamy następujący wynik

Wyjście:

Otrzymujemy formularz, w którym znajdują się pola umożliwiające wybranie pliku z katalogu. Po wybraniu pliku musimy kliknąć przycisk przesyłania.

Przesyłanie plików za pomocą operacji JSP

Po kliknięciu przycisku przesyłania pojawia się komunikat, że plik został pomyślnie przesłany.

Przesyłanie plików za pomocą operacji JSP

Na poniższym diagramie widać, że plik został przesłany do folderu c:/guru/upload.

Przesyłanie plików za pomocą operacji JSP

Pobierz plik JSP

W tym przykładzie pobierzemy plik z katalogu klikając na przycisk.

Pobieranie_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>

Wyjaśnienie kodu:

Linia kodu 10: Tutaj podaliśmy link do pobrania pliku z folderu c:/guru/upload przy użyciu serwletu 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
	}

}

Wyjaśnienie kodu:

Linia kodu 3-5: Tutaj importujemy FileInputStream , wyjątek IO i PrintWriter z pakietu java.io.

Linia kodu 15: Definiujemy guru_download serwlet który rozszerza HttpServlet.

Linia kodu 18: Ponieważ zdefiniowaliśmy href, który będzie zawarty w adresie URL, przetworzona zostanie metoda GET (w serwlecie zostanie wywołany doGet), który zawiera również obiekty żądań i odpowiedzi.

Linia kodu 19-20: Ustawiamy treść. Wpisz obiekt odpowiedzi, a także pobierz obiekt zapisujący z odpowiedzi.

Linia kodu 21-22: Zdefiniowanie zmiennej jako gurufile jako wartość test.txt i gurupath jako c:/guru/upload/

Linia kodu 23-25: Typ treści ustawiamy za pomocą obiektu odpowiedzi i używamy metody setHeader, która ustawia nagłówek w obiekcie odpowiedzi jako nazwę przesłanego pliku.

Linia kodu 27-28: Tworzymy FileInputStream, w którym dodamy gurupath+gurufile.

Linia kodu 31-33: Tutaj wzięliśmy A pętla while który będzie działał do momentu odczytania pliku, dlatego podaliśmy warunek jako != -1. W tym stanie piszemy przy użyciu obiektu printwriter.

Po wykonaniu powyższego kodu otrzymasz następujący wynik

Wyjście:

Pobieranie pliku

Wyjście:

Musimy kliknąć downloading_1.jsp, otrzymamy hiperłącze „Pobierz tutaj”. Po kliknięciu tego pliku hiperłącza zostanie on pobrany do systemu.

Podsumowanie

  • Dowiedzieliśmy się o formularzu rejestracyjnym umożliwiającym rejestrację w dowolnej aplikacji
  • Dowiedziałem się więcej o działaniu formularzy logowania i wylogowywania.
  • Dowiedziałem się również, jak przesyłać i pobierać pliki za pomocą JSP.