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
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.
Po kliknięciu przycisku przesyłania pojawia się komunikat, że plik został pomyślnie przesłany.
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:
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:
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.





