JSP - Tải lên tệp

Trong chương này, chúng ta sẽ thảo luận về Tải lên tệp trong JSP. JSP có thể được sử dụng với thẻ biểu mẫu HTML để cho phép người dùng tải tệp lên máy chủ. Tệp được tải lên có thể là tệp văn bản hoặc tệp nhị phân hoặc tệp hình ảnh hoặc bất kỳ tài liệu nào.

Tạo biểu mẫu tải lên tệp

Bây giờ chúng ta hãy hiểu cách tạo biểu mẫu tải lên tệp. Mã HTML sau tạo một biểu mẫu người tải lên. Sau đây là những điểm quan trọng cần lưu ý:

  • Hình thức method thuộc tính phải được đặt thành POST không thể sử dụng phương thức và phương thức GET.

  • Hình thức enctype thuộc tính phải được đặt thành multipart/form-data.

  • Hình thức actionthuộc tính phải được đặt thành tệp JSP sẽ xử lý việc tải tệp lên tại máy chủ phụ trợ. Ví dụ sau đang sử dụnguploadFile.jsp tệp chương trình để tải tệp lên.

  • Để tải lên một tệp, bạn nên sử dụng một tệp <input .../> thẻ với thuộc tính type = "file". Để cho phép tải lên nhiều tệp, hãy bao gồm nhiều thẻ đầu vào với các giá trị khác nhau cho thuộc tính name. Trình duyệt liên kết nút Duyệt với mỗi nút trong số chúng.

<html>
   <head>
      <title>File Uploading Form</title>
   </head>
   
   <body>
      <h3>File Upload:</h3>
      Select a file to upload: <br />
      <form action = "UploadServlet" method = "post"
         enctype = "multipart/form-data">
         <input type = "file" name = "file" size = "50" />
         <br />
         <input type = "submit" value = "Upload File" />
      </form>
   </body>
   
</html>

Điều này sẽ hiển thị kết quả sau. Bây giờ bạn có thể chọn một tệp từ PC cục bộ và khi người dùng nhấp vào "Tải lên Tệp", biểu mẫu sẽ được gửi cùng với tệp đã chọn -

File Upload

Select a file to upload −



NOTE - Biểu mẫu trên chỉ là biểu mẫu giả và sẽ không hoạt động, bạn nên thử mã trên trên máy của bạn để làm cho nó hoạt động.

Viết tập lệnh JSP phụ trợ

Bây giờ chúng ta hãy xác định một vị trí nơi các tệp đã tải lên sẽ được lưu trữ. Bạn có thể viết mã này trong chương trình của mình hoặc tên thư mục này cũng có thể được thêm vào bằng cách sử dụng cấu hình bên ngoài, chẳng hạn nhưcontext-param phần tử trong web.xml như sau:

<web-app>
....
<context-param> 
   <description>Location to store uploaded file</description> 
   <param-name>file-upload</param-name> 
   <param-value>
      c:\apache-tomcat-5.5.29\webapps\data\
   </param-value> 
</context-param>
....
</web-app>

Sau đây là mã nguồn cho UploadFile.jsp. Điều này có thể xử lý việc tải lên nhiều tệp cùng một lúc. Bây giờ chúng ta hãy xem xét những điều sau đây trước khi tiếp tục tải tệp lên.

  • Ví dụ sau đây phụ thuộc vào FileUpload; đảm bảo rằng bạn có phiên bản mới nhất củacommons-fileupload.x.x.jartệp trong classpath của bạn. Bạn có thể tải xuống từhttps://commons.apache.org/fileupload/.

  • FileUpload phụ thuộc vào Commons IO; đảm bảo rằng bạn có phiên bản mới nhất củacommons-io-x.x.jartệp trong classpath của bạn. Bạn có thể tải xuống từhttps://commons.apache.org/io/.

  • Trong khi kiểm tra ví dụ sau, bạn nên tải lên tệp có kích thước nhỏ hơn maxFileSize nếu không tệp sẽ không được tải lên.

  • Đảm bảo rằng bạn đã tạo các thư mục c:\tempc:\apache-tomcat5.5.29\webapps\data tốt trước.

<%@ 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.*" %>

<%
   File file ;
   int maxFileSize = 5000 * 1024;
   int maxMemSize = 5000 * 1024;
   ServletContext context = pageContext.getServletContext();
   String filePath = context.getInitParameter("file-upload");

   // Verify the content type
   String contentType = request.getContentType();
   
   if ((contentType.indexOf("multipart/form-data") >= 0)) {
      DiskFileItemFactory factory = new DiskFileItemFactory();
      // maximum size that will be stored in memory
      factory.setSizeThreshold(maxMemSize);
      
      // Location to save data that is larger than maxMemSize.
      factory.setRepository(new File("c:\\temp"));

      // Create a new file upload handler
      ServletFileUpload upload = new ServletFileUpload(factory);
      
      // maximum file size to be uploaded.
      upload.setSizeMax( maxFileSize );
      
      try { 
         // Parse the request to get file items.
         List fileItems = upload.parseRequest(request);

         // Process the uploaded file items
         Iterator i = fileItems.iterator();

         out.println("<html>");
         out.println("<head>");
         out.println("<title>JSP File upload</title>");  
         out.println("</head>");
         out.println("<body>");
         
         while ( i.hasNext () ) {
            FileItem fi = (FileItem)i.next();
            if ( !fi.isFormField () ) {
               // Get the uploaded file parameters
               String fieldName = fi.getFieldName();
               String fileName = fi.getName();
               boolean isInMemory = fi.isInMemory();
               long sizeInBytes = fi.getSize();
            
               // Write the file
               if( fileName.lastIndexOf("\\") >= 0 ) {
                  file = new File( filePath + 
                  fileName.substring( fileName.lastIndexOf("\\"))) ;
               } else {
                  file = new File( filePath + 
                  fileName.substring(fileName.lastIndexOf("\\")+1)) ;
               }
               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("<head>");
      out.println("<title>Servlet upload</title>");  
      out.println("</head>");
      out.println("<body>");
      out.println("<p>No file uploaded</p>"); 
      out.println("</body>");
      out.println("</html>");
   }
%>

Bây giờ hãy thử tải tệp lên bằng biểu mẫu HTML mà bạn đã tạo ở trên. Khi bạn thửhttp://localhost:8080/UploadFile.htm, nó sẽ hiển thị kết quả sau. Điều này sẽ giúp bạn tải lên bất kỳ tệp nào từ máy cục bộ của bạn.

File Upload

Select a file to upload −


Nếu tập lệnh JSP của bạn hoạt động tốt, tệp của bạn sẽ được tải lên trong c:\apache-tomcat5.5.29\webapps\data\ danh mục.