Tải lên và tải xuống tệp JSP
Trong ví dụ này, chúng ta sẽ tìm hiểu về cách tải lên và tải xuống một tệp thông qua JSP.
File input đầu ra là những thao tác rất quan trọng. Ở đây chúng ta sẽ đọc và ghi một tập tin bằng JSP.
Tải lên tệp JSP
- Chúng tôi có thể tải lên bất kỳ tệp nào bằng cách sử dụng JSP.
- Nó có thể là tệp văn bản, tệp nhị phân, tệp hình ảnh hoặc bất kỳ tài liệu nào khác.
- Ở đây trong trường hợp tải tệp lên, chỉ phương thức POST sẽ được sử dụng chứ không phải phương thức GET.
- Thuộc tính Enctype phải được đặt thành multipart/form-data.
Ví dụ: Sử dụng hành động
Trong ví dụ này, chúng tôi đang tải lên một tệp bằng đối tượng 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>
Giải thích mã:
Action_file.jsp
Dòng mã 12-18: Ở đây chúng ta đang tạo biểu mẫu với trường tệp, trường này sẽ tải tệp lên máy chủ và hành động sẽ được chuyển đến action_file_upload.jsp
Action_file_upload.jsp
Dòng mã 20: Ở đây chúng tôi đang đưa đường dẫn tệp đến một đường dẫn cụ thể
Dòng mã 23-38: Ở đây chúng tôi kiểm tra xem loại nội dung có phải là multipart/form-data hay không. Nếu đúng như vậy thì nội dung thuộc loại tệp và được đọc. Sau khi đọc tệp, nó được ghi vào tệp tạm thời và sau đó tệp tạm thời sẽ được chuyển đổi thành tệp chính.
Khi bạn thực thi đoạn mã trên, bạn sẽ nhận được kết quả sau
Đầu ra:
Chúng tôi đang tải tệp lên bằng cách sử dụng tùy chọn nút chọn tệp và nút tải tệp lên sẽ tải tệp lên máy chủ theo đường dẫn được cung cấp.
Ví dụ: Sử dụng các thao tác JSP
Trong ví dụ này, chúng ta sẽ tải lên một tệp bằng các hoạt động JSP. Chúng ta sẽ lấy một biểu mẫu có nút "tải lên" và khi bạn nhấp vào nút tải lên thì tệp sẽ được tải lên.
Đang tải lê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>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>
Giải thích mã:
Dòng mã 11-12: Ở đây chúng ta đang lấy một biểu mẫu có hành động trên servlet guru_upload sẽ chuyển qua phương thức POST. Ngoài ra, ở đây chúng ta enctype thuộc tính ie chỉ định cách dữ liệu biểu mẫu sẽ được mã hóa và gửi đến máy chủ và nó chỉ được sử dụng với phương thức POST. Ở đây chúng ta đang thiết lập là multipart/form-data dành cho tệp (vì dữ liệu sẽ lớn).
Dòng mã 13: Ở đây chúng tôi đang chỉ định phần tử guru_file với loại tệp và cho kích thước là 50.
Dòng mã 15: Đây là nút loại gửi có tên "Tải lên" trên đó, qua đó servlet hành động sẽ được gọi và yêu cầu sẽ được xử lý trong đó và tệp sẽ được đọc và ghi vào servlet.
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); } }
Giải thích mã:
Dòng mã 12-14: Ở đây chúng ta sẽ phải nhập thư viện org.apache.commons vào cấu hình của mã. Chúng ta sẽ phải nhập lớp tải tệp lên từ thư viện org.apache.commons.
Dòng mã 23: Ở đây chúng ta có phương thức doPost(), phương thức này sẽ được gọi khi chúng ta truyền phương thức POST trong JSP và nó sẽ yêu cầu và phản hồi các đối tượng làm tham số của nó
Dòng mã 26: Ở đây chúng ta đang tạo một đối tượng của lớp ServletFileUpload từ gói fileUpload từ thư viện org.apache.commons để kiểm tra xem có bất kỳ đối tượng tệp nào trong JSP hay không. Nếu tìm thấy thì đối tượng tệp đó sẽ được lấy từ yêu cầu.
Dòng mã 27-32: Chúng tôi sẽ lặp lại số lượng tệp bằng cách kiểm tra xem có bao nhiêu mục tệp có trong đối tượng multiparts là đối tượng danh sách (nếu chúng tôi tải lên nhiều tệp) và lưu nó vào thư mục c:/guru/upload với tên tệp đã được cung cấp . Chúng tôi đang ghi tệp bằng phương thức ghi của fileobject vào thư mục đã được đề cập.
Dòng mã 34: Nếu không có ngoại lệ thì chúng tôi sẽ đặt thuộc tính trong yêu cầu dưới dạng tin nhắn chính với giá trị “Đã tải lên tệp thành công”.
Dòng mã 35-36: Nếu ngoại lệ xảy ra thì cài đặt thông báo “Tải lên tệp không thành công”
Dòng mã 40: Nếu không tìm thấy tệp thì cài đặt thông báo là “Không tìm thấy tệp”
Dòng mã 42: Chuyển tiếp yêu cầu sử dụng đối tượng requestdispatcher tới result.jsp với các đối tượng yêu cầu và phản hồi.
Kết quả.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>
Giải thích mã:
Dòng mã 10: Ở đây chúng ta đang lấy thuộc tính từ đối tượng yêu cầu có giá trị gurumessage thành một đối tượng chuỗi.
Mã Dòng11: Ở đây chúng tôi đang in tin nhắn đó.
Khi chúng ta thực thi đoạn mã trên, chúng ta sẽ nhận được kết quả sau
Đầu ra:
Chúng tôi nhận được một biểu mẫu trong đó có các trường để chọn tệp từ thư mục. Sau khi chọn xong tệp, chúng ta phải nhấp vào nút tải lên.
Sau khi nhấp vào nút tải lên, chúng tôi nhận được thông báo rằng tệp đã được tải lên thành công.
Trong sơ đồ bên dưới, chúng ta có thể thấy tệp đó đã được tải lên trong thư mục c:/guru/upload.
Tải xuống tệp JSP
Trong ví dụ này, chúng ta sẽ tải xuống một tệp từ một thư mục bằng cách nhấp vào nút.
Đang tải xuống_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>
Giải thích mã:
Dòng mã 10: Ở đây chúng tôi đã đưa ra liên kết để tải xuống một tệp từ thư mục c:/guru/upload bằng cách sử dụng servlet 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 } }
Giải thích mã:
Dòng mã 3-5: Ở đây chúng tôi đang nhập FileInputStream , IO Exception và PrintWriter từ gói java.io.
Dòng mã 15: Chúng tôi đang xác định guru_download Servlet mở rộng HttpServlet.
Dòng mã 18: Vì chúng ta đã xác định a href, nó sẽ được đặt trong URL nên phương thức GET sẽ được xử lý (doGet sẽ được gọi trong servlet), nó cũng bao gồm các đối tượng yêu cầu và phản hồi.
Dòng mã 19-20: Chúng tôi đang đặt Loại nội dung trong đối tượng phản hồi và cũng lấy đối tượng người viết từ phản hồi.
Dòng mã 21-22: Xác định một biến là gurufile là giá trị test.txt và gurupath là c:/guru/upload/
Dòng mã 23-25: Chúng tôi đang đặt loại nội dung bằng cách sử dụng đối tượng phản hồi và chúng tôi sử dụng phương thức setHeader để đặt tiêu đề vào đối tượng phản hồi làm tên tệp đã được tải lên.
Dòng mã 27-28: Chúng tôi đang tạo FileInputStream trong đó chúng tôi sẽ thêm gurupath+gurufile.
Dòng mã 31-33: Ở đây chúng tôi đã lấy một trong khi lặp lại nó sẽ chạy cho đến khi tệp được đọc, do đó chúng tôi đã đưa ra điều kiện là != -1. Trong điều kiện này chúng ta đang viết bằng cách sử dụng đối tượng printwriter.
Khi bạn thực thi đoạn mã trên, bạn sẽ nhận được kết quả sau
Đầu ra:
Đầu ra:
Chúng ta phải nhấp vàodownload_1.jsp, chúng ta sẽ nhận được một siêu liên kết có tên “Tải xuống tại đây”. Khi bạn bấm vào file siêu liên kết này, nó sẽ được tải xuống hệ thống.
Tổng kết
- Chúng ta đã tìm hiểu về mẫu đăng ký để đăng ký vào bất kỳ ứng dụng nào
- Đã tìm hiểu thêm về cách hoạt động của biểu mẫu đăng nhập và đăng xuất.
- Ngoài ra còn tìm hiểu về cách tải lên và tải xuống tệp thông qua JSP.