📜  Struts 2-文件上传

📅  最后修改于: 2020-11-11 04:59:24             🧑  作者: Mango


Struts 2框架提供内置支持,可使用“ HTML中基于表单的文件上载”来处理文件上载。上传文件后,通常会将其存储在一个临时目录中,并且Action类应将其处理或移动到永久目录中,以确保数据不会丢失。

–服务器可能具有适当的安全策略,该策略禁止您写入除临时目录和属于Web应用程序的目录以外的目录。

通过预定义的拦截器FileUpload拦截器可以在Struts中上传文件,该拦截器可通过org.apache.struts2.interceptor.FileUploadInterceptor类获得,并作为defaultStack的一部分包含在内。仍然可以在struts.xml中使用它来设置各种参数,如下所示。

创建查看文件

让我们从创建我们的视图开始,这是浏览和上传选定文件所必需的。因此,让我们创建具有纯HTML上传格式的index.jsp ,该格式允许用户上传文件-

File Upload
   
   
   
      

在上面的示例中有几点值得注意。首先,将表单的enctype设置为multipart / form-data 。应该进行设置,以便文件上传拦截器成功处理文件上传。接下来要注意的是表单的操作方法上载以及文件上载字段的名称,即myFile 。我们需要此信息来创建操作方法和struts配置。

接下来,让我们创建一个简单的jsp文件success.jsp,以显示文件上传成功的结果。

File Upload Success
   
   
   
      You have successfully uploaded 
   

如果上传文件时出现一些错误,下面将是结果文件error.jsp-

File Upload Error
   
   
   
      There has been an error in uploading the file.
   

创建动作类

接下来,让我们创建一个名为uploadFile.java的Java类,该类将负责上传文件并将该文件存储在安全的位置-

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;
   }
}

uploadFile.java是一个非常简单的类。需要注意的重要一点是FileUpload拦截器与Parameters Interceptor一起为我们完成了所有繁重的工作。

默认情况下,FileUpload拦截器使三个参数可用。它们以以下模式命名-

  • [您的文件名参数] -这是用户已上传的实际文件。在此示例中,它将是“ myFile”

  • [您的文件名参数] ContentType-这是上载文件的内容类型。在此示例中,它将是“ myFileContentType”

  • [您的文件名参数] FileName-这是上载的文件名。在此示例中,它将是“ myFileFileName”

感谢Struts拦截器,这三个参数对我们可用。我们要做的就是在Action类中使用正确的名称创建三个参数,然后自动为我们自动连接这些变量。因此,在上面的示例中,我们有三个参数和一个操作方法,如果一切正常,则该方法简单地返回“成功”,否则返回“错误”。

配置文件

以下是控制文件上传过程的Struts2配置属性-

Sr.No Properties & Description
1

struts.multipart.maxSize

The maximum size (in bytes) of a file to be accepted as a file upload. Default is 250M.

2

struts.multipart.parser

The library used to upload the multipart form. By default is jakarta

3

struts.multipart.saveDir

The location to store the temporary file. By default is javax.servlet.context.tempdir.

为了更改这些设置中的任何一个,您可以在应用程序的struts.xml文件中使用常量标记,就像我更改要上传的文件的最大大小一样。

让我们有如下的struts.xml-





   
   
   
      
         /success.jsp
         /error.jsp
      
   

由于FileUpload拦截器是默认拦截器堆栈的一部分,因此我们无需显式配置它。但是,您可以在内添加标签。 fileUpload拦截器采用两个参数(a)maximumSize(b)allowedTypes

maximumSize参数设置允许的最大文件大小(默认值约为2MB)。 allowedTypes参数是用逗号分隔的接受内容(MIME)类型的列表,如下所示-


   
   
      image/jpeg,image/gif
   
   /success.jsp
   /error.jsp

以下是web.xml文件的内容-



   
   Struts 2
   
   
      index.jsp
   
   
   
      struts2
      
         org.apache.struts2.dispatcher.FilterDispatcher
      
   

   
      struts2
      /*
   

现在,右键单击项目名称,然后单击导出> WAR文件以创建War文件。然后,将此WAR部署在Tomcat的webapps目录中。最后,启动Tomcat服务器并尝试访问URL http:// localhost:8080 / HelloWorldStruts2 / upload.jsp 。这将产生以下屏幕-

你好世界支柱7

现在,使用“浏览”按钮选择一个文件“ Contacts.txt”,然后单击“上传”按钮,这会将文件上传到您的服务中,您应该会看到下一页。您可以检查上传的文件应保存在C:\ apache-tomcat-6.0.33 \ work中。

你好世界支柱8

请注意,FileUpload Interceptor会自动删除上传的文件,因此您必须以编程方式将上传的文件保存在某个位置,然后再将其删除。

错误讯息

fileUplaod拦截器使用多个默认错误消息密钥-

Sr.No Error Message Key & Description
1

struts.messages.error.uploading

A general error that occurs when the file could not be uploaded.

2

struts.messages.error.file.too.large

Occurs when the uploaded file is too large as specified by maximumSize.

3

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

Occurs when the uploaded file does not match the expected content types specified.

您可以在WebContent / WEB-INF / classes / messages.properties资源文件中覆盖这些消息的文本。