Przesyłanie i pobieranie plików JSP
⚡ Inteligentne podsumowanie
Przesyłanie i pobieranie plików JSP to podstawowe operacje wejścia i wyjścia, które umożliwiają aplikacji internetowej odbieranie plików od użytkowników i udostępnianie ich z powrotem. W tym materiale wyjaśniono oba przepływy za pomocą formularzy akcji JSP, funkcji przesyłania plików Apache Commons oraz klas serwletów, wraz z kompletnym, działającym kodem.

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 korzystając z 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
Code Linia 12-18: Tutaj tworzymy formularz z polem pliku, który prześle plik na serwer, a akcja zostanie przekazana do action_file_upload.jsp.
Action_file_upload.jsp
Code Linia 20: Tutaj podajemy ścieżkę do pliku do określonej ścieżki.
Code Linia 23-38: Tutaj sprawdzamy, czy typem zawartości jest multipart/form-data. Jeśli tak, zawartość jest typu pliku i jest odczytywana. Po odczytaniu plik jest zapisywany w pliku tymczasowym, a następnie plik tymczasowy jest konwertowany na plik główny.
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
Wyjście:
Przesyłamy plik za pomocą przycisku „Wybierz plik”, a przycisk „Prześlij plik” prześle plik na serwer do wskazanej ścieżki.
Przykład: Korzystanie z operacji JSP
W tym przykładzie prześlemy plik za pomocą operacji JSP. Użyjemy formularza z przyciskiem „prześlij”, a po kliknięciu przycisku „prześlij” 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:
Code Linia 11-12: Tutaj bierzemy formularz, który ma akcję na serwlecie guru_upload, która przejdzie przez metodę POST. Ponadto, atrybut enctype określa tutaj sposób kodowania i przesyłania danych formularza do serwera i jest używany tylko z metodą POST. Tutaj ustawiamy go jako multipart/form-data, co dotyczy pliku (ponieważ dane będą duże).
Code Linia 13: Tutaj określamy element guru_file z typem pliku i podajemy rozmiar 50.
Code Linia 15: To przycisk typu „Prześlij” o nazwie „Prześlij”, za pomocą którego zostanie wywołany serwlet akcji, żądanie zostanie przetworzone w tym serwlecie, 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:
Code Linia 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.
Code Linia 23: Tutaj mamy metodę doPost(), która zostanie wywołana, gdy przekazujemy metodę POST w JSP, i która będzie przyjmować obiekty żądania i odpowiedzi jako swoje parametry.
Code Linia 26: Tutaj tworzymy obiekt klasy ServletFileUpload z pakietu fileUpload biblioteki org.apache.commons, który sprawdzi, czy w JSP znajdują się jakieś obiekty plikowe. Jeśli takie zostaną znalezione, zostaną one pobrane z żądania.
Code Linia 27-32: Przeanalizujemy liczbę plików, sprawdzając, ile elementó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 pod podaną nazwą. Plik zapisujemy za pomocą metody write obiektu file do wskazanego folderu.
Code Linia 34: Jeśli nie wystąpi żaden wyjątek, wówczas w żądaniu ustawiamy atrybut gurumessage z wartością „Plik przesłany pomyślnie”.
Code Linia 35-36: Jeśli wystąpi wyjątek, wyświetli się komunikat „Nie udało się przesłać pliku”.
Code Linia 40: Jeżeli plik nie zostanie znaleziony, wówczas ustawiamy komunikat „Nie znaleziono pliku”.
Code Linia 42: Przekazanie żądania za pomocą obiektu requestdispatcher do result.jsp z obiektami request i response.
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:
Code Linia 10: Tutaj pobieramy atrybut z obiektu żądania o wartości gurumessage do obiektu ciągu.
Code Linia 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 do wyboru pliku z katalogu. Po wybraniu pliku klikamy przycisk „Prześlij”.
Po kliknięciu przycisku przesyłania pojawi się komunikat informujący o pomyślnym przesłaniu pliku.
Na poniższym diagramie widać, że plik został przesłany do folderu c:/guru/upload.
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:
Code Linia 10: Tutaj podaliśmy link umożliwiający pobranie pliku z folderu c:/guru/upload za pomocą 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:
Code Linia 3-5: Tutaj importujemy FileInputStream, IOException i PrintWriter z pakietu java.io.
Code Linia 15: Definiujemy guru_download serwlet który rozszerza HttpServlet.
Code Linia 18: Ponieważ zdefiniowaliśmy href, który będzie ujęty w URL, więc metoda GET zostanie przetworzona (w serwlecie zostanie wywołana metoda doGet), która obejmuje również obiekty żądania i odpowiedzi.
Code Linia 19-20: Ustawiamy typ zawartości w obiekcie odpowiedzi i pobieramy również obiekt pisarza z odpowiedzi.
Code Linia 21-22: Zdefiniowanie zmiennej jako gurufile z wartością test.txt i gurupath jako c:/guru/upload/.
Code Linia 23-25: Ustawiamy typ zawartości za pomocą obiektu odpowiedzi i używamy metody setHeader, która ustawia nagłówek w obiekcie odpowiedzi jako nazwę przesłanego pliku.
Code Linia 27-28: Tworzymy strumień wejściowy FileInputStream, do którego dodamy gurupath+gurufile.
Code Linia 31-33: Tutaj wzięliśmy A pętla while który będzie działał do momentu odczytania pliku, stąd podaliśmy warunek != -1. W tym przypadku zapisujemy, używając obiektu printwriter.
Po wykonaniu powyższego kodu otrzymasz następujący wynik:
Wyjście:
Klikamy na plik downloading_1.jsp, a pojawi się hiperłącze „Pobierz tutaj”. Po kliknięciu tego hiperłącza plik zostanie pobrany do systemu.





