Качване и изтегляне на JSP файл
⚡ Умно обобщение
Качването и изтеглянето на JSP файлове са основни операции за вход и изход, които позволяват на уеб приложението да получава файлове от потребители и да им ги предоставя обратно. Този ресурс обяснява и двата процеса, използвайки JSP формуляри за действие, Apache Commons FileUpload и класове на сървлети, с пълен работещ код.

Качване на JSP файл
- Можем да качваме всякакви файлове с помощта на JSP.
- Това може да бъде текстов файл, двоичен файл, файл с изображение или друг документ.
- Тук, в случай на качване на файл, ще се използва само методът POST, а не методът GET.
- Атрибутът Enctype трябва да бъде зададен на multipart/form-data.
Пример: Използване на действие
В този пример качваме файл, използвайки 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>
Обяснение на кода:
Action_file.jsp
Code Ред 12-18: Тук създаваме формуляр с поле за файл, което ще качи файл на сървъра, а действието ще бъде предадено на action_file_upload.jsp.
Action_file_upload.jsp
Code Ред 20: Тук ние даваме пътя на файла до определен път.
Code Ред 23-38: Тук проверяваме дали типът съдържание е multipart/form-data. Ако случаят е такъв, тогава съдържанието е от файлов тип и се чете. След като файлът бъде прочетен, той се записва във временния файл, а след това временният файл се конвертира в основния файл.
Когато изпълните горния код, получавате следния изход:
Изход:
Качваме файл, използвайки опцията за избор на файл, а бутонът за качване на файл ще качи файла на сървъра по предоставения път.
Пример: Използване на JSP операции
В този пример ще качим файл, използвайки JSP операции. Ще вземем формуляр, който ще има бутон „качване“ и когато кликнете върху бутона за качване, файлът ще бъде качен.
Качване_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>
Обяснение на кода:
Code Ред 11-12: Тук вземаме формуляр, който има действие върху сървлета guru_upload, което ще премине през POST метод. Също така, тук атрибутът enctype определя как данните от формуляра трябва да бъдат кодирани и изпратени до сървъра и се използва само с POST метода. Тук го задаваме като multipart/form-data, което е за файла (тъй като данните ще бъдат големи).
Code Ред 13: Тук ние определяме елемента guru_file с тип file и даваме размера 50.
Code Ред 15: Това е бутон от тип „изпращане“ с името „Качване“, чрез който ще бъде извикан сървлетът за действие и заявката ще бъде обработена в него, а файлът ще бъде прочетен и записан в сървлета.
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); } }
Обяснение на кода:
Code Ред 12-14: Тук ще трябва да импортираме библиотеката org.apache.commons в конфигурацията на кода. Ще трябва да импортираме класа fileupload от библиотеката org.apache.commons.
Code Ред 23: Тук имаме метода doPost(), който ще бъде извикан, когато предаваме POST метода в JSP, и ще приема обекти request и response като параметри.
Code Ред 26: Тук създаваме обект от класа ServletFileUpload от пакета fileUpload на библиотеката org.apache.commons, който ще провери дали има файлови обекти в JSP. Ако бъдат намерени такива, тези файлови обекти ще бъдат взети от заявката.
Code Ред 27-32: Ще итерираме върху броя на файловете, като проверим колко файлови елемента присъстват в обекта multiparts, който е обект тип списък (ако качваме повече от един файл), и ще го запишем в папката c:/guru/upload с предоставеното име на файла. Записваме файла, използвайки метода write на обекта file, в споменатата папка.
Code Ред 34: Ако няма изключение, тогава задаваме атрибут в заявката като gurumessage със стойност „Файлът е качен успешно“.
Code Ред 35-36: Ако възникне изключение, задаваме съобщение „Качването на файл неуспешно“.
Code Ред 40: Ако файлът не е намерен, задаваме съобщението като „Няма намерен файл“.
Code Ред 42: Препращане на заявката чрез обекта requestdispatcher към result.jsp с обекти request и 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>
Обяснение на кода:
Code Ред 10: Тук получаваме атрибута от обекта на заявката със стойност gurumessage в обект тип низ.
Code Ред 11: Тук отпечатваме това съобщение.
Когато изпълним горния код, получаваме следния изход:
Изход:
Получаваме формуляр, в който има полета за избор на файл от директорията. След като файлът е избран, трябва да кликнем върху бутона за качване.
След като щракнете върху бутона за качване, получаваме съобщение, че файлът е качен успешно.
На диаграмата по-долу можем да видим, че файлът е качен в папката c:/guru/upload.
Изтегляне на JSP файл
В този пример ще изтеглим файл от директория, като щракнете върху бутона.
Изтегляне_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>
Обяснение на кода:
Code Ред 10: Тук сме дали линк за изтегляне на файл от папката c:/guru/upload, използвайки сървлета 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 } }
Обяснение на кода:
Code Ред 3-5: Тук импортираме FileInputStream, IOException и Print.Writer от пакета java.io.
Code Ред 15: Дефинираме guru_download сървлет който разширява HttpServlet.
Code Ред 18: Както дефинирахме href, който ще бъде ограден в URL, така че методът GET ще бъде обработен (doGet ще бъде извикан в сървлета), който също така обхваща обекти за заявка и отговор.
Code Ред 19-20: Задаваме типа съдържание в обекта response и също така получаваме обекта writer от отговора.
Code Ред 21-22: Дефиниране на променлива като gurufile със стойност test.txt и gurupath като c:/guru/upload/.
Code Ред 23-25: Задаваме типа съдържание, използвайки обекта response, и използваме метода setHeader, който задава заглавката в обекта response като името на качения файл.
Code Ред 27-28: Създаваме FileInputStream, в който ще добавим gurupath+gurufile.
Code Ред 31-33: Тук сме взели a докато цикъл който ще се изпълнява, докато файлът бъде прочетен, следователно сме задали условието като != -1. В това условие записваме, използвайки обекта printwriter.
Когато изпълните горния код, ще получите следния изход:
Изход:
Трябва да кликнем върху downloading_1.jsp и ще получим хипервръзка „Изтеглете оттук“. Когато кликнете върху този файл с хипервръзка, той ще бъде изтеглен в системата.





