Tải lên và tải xuống tệp JSP
⚡ Tóm tắt thông minh
Tải lên và tải xuống tập tin JSP là các thao tác nhập và xuất cốt lõi cho phép ứng dụng web nhận tập tin từ người dùng và trả lại tập tin cho họ. Tài liệu này giải thích cả hai luồng bằng cách sử dụng các biểu mẫu hành động JSP, Apache Commons FileUpload và các lớp servlet, với mã hoạt động hoàn chỉnh.

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





