Struts 2 - Tải lên tệp

Khuôn khổ Struts 2 cung cấp hỗ trợ tích hợp để xử lý tải lên tệp bằng cách sử dụng "Tải lên tệp dựa trên biểu mẫu trong HTML". Khi một tệp được tải lên, nó thường sẽ được lưu trữ trong một thư mục tạm thời và chúng sẽ được xử lý hoặc di chuyển bởi lớp Hành động của bạn vào một thư mục cố định để đảm bảo dữ liệu không bị mất.

Note - Máy chủ có thể có chính sách bảo mật cấm bạn ghi vào các thư mục khác với thư mục tạm thời và các thư mục thuộc ứng dụng web của bạn.

Có thể tải lên tệp trong Struts thông qua một bộ chặn được xác định trước được gọi là FileUpload interceptor có sẵn thông qua lớp org.apache.struts2.interceptor.FileUploadInterceptor và được bao gồm như một phần củadefaultStack. Bạn vẫn có thể sử dụng nó trong struts.xml của mình để thiết lập các tham số khác nhau như chúng ta sẽ thấy bên dưới.

Tạo tệp xem

Hãy để chúng tôi bắt đầu với việc tạo chế độ xem của chúng tôi, chế độ này sẽ được yêu cầu để duyệt và tải lên một tệp đã chọn. Vì vậy, hãy để chúng tôi tạo ra mộtindex.jsp với biểu mẫu tải lên HTML thuần túy cho phép người dùng tải lên tệp -

<%@ page language = "java" contentType = "text/html; charset = ISO-8859-1"
   pageEncoding = "ISO-8859-1"%>
<%@ taglib prefix = "s" uri = "/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 
   "http://www.w3.org/TR/html4/loose.dtd">

<html>
   <head>
      <title>File Upload</title>
   </head>
   
   <body>
      <form action = "upload" method = "post" enctype = "multipart/form-data">
         <label for = "myFile">Upload your file</label>
         <input type = "file" name = "myFile" />
         <input type = "submit" value = "Upload"/>
      </form>
   </body>
</html>

Có một số điểm đáng chú ý trong ví dụ trên. Đầu tiên, enctype của biểu mẫu được đặt thànhmultipart/form-data. Điều này phải được đặt để quá trình tải lên tệp được xử lý thành công bởi trình chặn tải tệp lên. Điểm tiếp theo cần lưu ý là phương thức hành động của biểu mẫuupload và tên của trường tải lên tệp - đó là myFile. Chúng ta cần thông tin này để tạo phương thức hành động và cấu hình thanh chống.

Tiếp theo, chúng ta hãy tạo một tệp jsp đơn giản success.jsp để hiển thị kết quả tải lên tệp của chúng tôi trong trường hợp nó thành công.

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>File Upload Success</title>
   </head>
   
   <body>
      You have successfully uploaded <s:property value = "myFileFileName"/>
   </body>
</html>

Sau đây sẽ là tệp kết quả error.jsp trong trường hợp có một số lỗi khi tải tệp lên -

<%@ page contentType = "text/html; charset = UTF-8" %>
<%@ taglib prefix = "s" uri = "/struts-tags" %>

<html>
   <head>
      <title>File Upload Error</title>
   </head>
   
   <body>
      There has been an error in uploading the file.
   </body>
</html>

Tạo lớp hành động

Tiếp theo, chúng ta hãy tạo một lớp Java có tên là uploadFile.java sẽ đảm nhận việc tải tệp lên và lưu trữ tệp đó ở một vị trí an toàn -

package com.tutorialspoint.struts2;

import java.io.File;
import org.apache.commons.io.FileUtils;
import java.io.IOException; 

import com.opensymphony.xwork2.ActionSupport;

public class uploadFile extends ActionSupport {
   private File myFile;
   private String myFileContentType;
   private String myFileFileName;
   private String destPath;

   public String execute() {
      /* Copy file to a safe location */
      destPath = "C:/apache-tomcat-6.0.33/work/";

      try {
         System.out.println("Src File name: " + myFile);
         System.out.println("Dst File name: " + myFileFileName);
     	    	 
         File destFile  = new File(destPath, myFileFileName);
         FileUtils.copyFile(myFile, destFile);
  
      } catch(IOException e) {
         e.printStackTrace();
         return ERROR;
      }

      return SUCCESS;
   }
   
   public File getMyFile() {
      return myFile;
   }
   
   public void setMyFile(File myFile) {
      this.myFile = myFile;
   }
   
   public String getMyFileContentType() {
      return myFileContentType;
   }
   
   public void setMyFileContentType(String myFileContentType) {
      this.myFileContentType = myFileContentType;
   }
   
   public String getMyFileFileName() {
      return myFileFileName;
   }
   
   public void setMyFileFileName(String myFileFileName) {
      this.myFileFileName = myFileFileName;
   }
}

Các uploadFile.javalà một lớp rất đơn giản. Điều quan trọng cần lưu ý là bộ đánh chặn FileUpload cùng với bộ đánh chặn tham số thực hiện tất cả những công việc nặng nhọc cho chúng ta.

Trình đánh chặn FileUpload làm cho ba tham số có sẵn cho bạn theo mặc định. Chúng được đặt tên theo mẫu sau:

  • [your file name parameter] - Đây là tệp thực tế mà người dùng đã tải lên. Trong ví dụ này, nó sẽ là "myFile"

  • [your file name parameter]ContentType- Đây là loại nội dung của tệp đã được tải lên. Trong ví dụ này, nó sẽ là "myFileContentType"

  • [your file name parameter]FileName- Đây là tên của tệp đã được tải lên. Trong ví dụ này, nó sẽ là "myFileFileName"

Ba tham số có sẵn cho chúng tôi, nhờ vào Struts Interceptors. Tất cả những gì chúng ta phải làm là tạo ba tham số có tên chính xác trong lớp Hành động của chúng ta và tự động các biến này được tự động chuyển đổi cho chúng ta. Vì vậy, trong ví dụ trên, chúng ta có ba tham số và một phương thức hành động chỉ đơn giản trả về "thành công" nếu mọi thứ diễn ra tốt đẹp, ngược lại nó trả về "lỗi".

Tệp cấu hình

Sau đây là các thuộc tính cấu hình Struts2 kiểm soát quá trình tải lên tệp:

Sr.No Thuộc tính & Mô tả
1

struts.multipart.maxSize

Kích thước tối đa (tính bằng byte) của tệp được chấp nhận là tệp tải lên. Mặc định là 250M.

2

struts.multipart.parser

Thư viện được sử dụng để tải lên biểu mẫu nhiều phần. Theo mặc định làjakarta

3

struts.multipart.saveDir

Vị trí lưu tệp tạm thời. Theo mặc định là javax.servlet.context.tempdir.

Để thay đổi bất kỳ cài đặt nào trong số này, bạn có thể sử dụng constant trong tệp struts.xml ứng dụng của bạn, như tôi đã làm để thay đổi kích thước tối đa của tệp được tải lên.

Hãy để chúng tôi có của chúng tôi struts.xml như sau -

<?xml version = "1.0" Encoding = "UTF-8"?>
<!DOCTYPE struts PUBLIC
   "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
   "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
   <constant name = "struts.devMode" value = "true" />
   <constant name = "struts.multipart.maxSize" value = "1000000" />
   <package name = "helloworld" extends = "struts-default">
      <action name = "upload" class = "com.tutorialspoint.struts2.uploadFile">
         <result name = "success">/success.jsp</result>
         <result name = "error">/error.jsp</result>
      </action>
   </package>
</struts>

Từ, FileUploadinterceptor là một phần của Stack of interceptor mặc định, chúng ta không cần phải cấu hình nó rõ ràng. Tuy nhiên, bạn có thể thêm thẻ <interceptor-ref> bên trong <action>. Trình đánh chặn fileUpload nhận hai tham số(a) maximumSize(b) allowedTypes.

Tham số MaximumSize đặt kích thước tệp tối đa cho phép (mặc định là khoảng 2MB). Tham số allowTypes là danh sách các loại nội dung được chấp nhận (MIME) được phân tách bằng dấu phẩy như được minh họa bên dưới:

<action name = "upload" class = "com.tutorialspoint.struts2.uploadFile">
   <interceptor-ref name = "basicStack">
   <interceptor-ref name = "fileUpload">
      <param name = "allowedTypes">image/jpeg,image/gif</param>
   </interceptor-ref>
   <result name = "success">/success.jsp</result>
   <result name = "error">/error.jsp</result>
</action>

Sau đây là nội dung của web.xml tập tin -

<?xml version = "1.0" Encoding = "UTF-8"?>
<web-app xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xmlns = "http://java.sun.com/xml/ns/javaee" 
   xmlns:web = "http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee 
   http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
   id = "WebApp_ID" version = "3.0">
   
   <display-name>Struts 2</display-name>
   
   <welcome-file-list>
      <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <filter>
      <filter-name>struts2</filter-name>
      <filter-class>
         org.apache.struts2.dispatcher.FilterDispatcher
      </filter-class>
   </filter>

   <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
</web-app>

Bây giờ Nhấp chuột phải vào tên dự án và nhấp vào Export > WAR Fileđể tạo tệp Chiến tranh. Sau đó, triển khai WAR này trong thư mục ứng dụng web của Tomcat. Cuối cùng, khởi động máy chủ Tomcat và cố gắng truy cập URLhttp://localhost:8080/HelloWorldStruts2/upload.jsp. Điều này sẽ tạo ra màn hình sau:

Bây giờ, hãy chọn một tệp "Contacts.txt" bằng cách sử dụng nút Duyệt qua và nhấp vào nút tải lên, nút này sẽ tải tệp lên trên lần phân phát của bạn và bạn sẽ thấy trang tiếp theo. Bạn có thể kiểm tra xem tệp đã tải lên có được lưu trong C: \ apache-tomcat-6.0.33 \ work.

Lưu ý rằng FileUpload Interceptor sẽ tự động xóa tệp đã tải lên, vì vậy bạn sẽ phải lưu tệp đã tải lên theo chương trình tại một số vị trí trước khi nó bị xóa.

Thông báo lỗi

Trình đánh chặn fileUplaod sử dụng một số khóa thông báo lỗi mặc định -

Sr.No Mã & Mô tả Thông báo Lỗi
1

struts.messages.error.uploading

Một lỗi chung xảy ra khi không thể tải lên tệp.

2

struts.messages.error.file.too.large

Xảy ra khi tệp được tải lên quá lớn như được chỉ định bởi MaximumSize.

3

struts.messages.error.content.type.not.allowed

Xảy ra khi tệp được tải lên không khớp với loại nội dung mong đợi được chỉ định.

Bạn có thể ghi đè văn bản của những tin nhắn này trong WebContent/WEB-INF/classes/messages.properties các tệp tài nguyên.