SSH框架网上商城项目第13战之Struts2文件上传功能

下面就给您讲解一下“SSH框架网上商城项目第13战之Struts2文件上传功能”的完整攻略。

一、Struts2文件上传功能简介

Struts2文件上传功能是指在Struts2框架中,用户可以通过向服务器提交文件的方式来实现文件上传的功能。Struts2文件上传功能通常采用Apache Commons FileUpload库来实现,可以对上传的文件进行大小、类型等方面的限制,同时支持上传多个文件。

二、实现Struts2文件上传的步骤

下面是实现Struts2文件上传功能的步骤:

1.在Struts2配置文件中添加上传功能的拦截器

在Struts2配置文件中,需要添加一个用于处理文件上传的拦截器,一般会用Apache Struts2文件上传拦截器,具体配置如下:

<interceptors>
  <interceptor name="myFileUpload"
      class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
  <interceptor-stack name="myDefault">
      <interceptor-ref name="defaultStack"/>
      <interceptor-ref name="myFileUpload"/>
  </interceptor-stack>
</interceptors>

2.在Action类中添加上传文件属性及其get和set方法

在Action类中,需要添加一个用于保存上传文件的属性,同时定义获取和设置该属性的get和set方法,具体代码如下:

private File file; // 用于保存上传文件
private String fileFileName; // 上传文件的文件名
private String fileContentType; // 上传文件的类型

public File getFile() {
  return file;
}

public void setFile(File file) {
  this.file = file;
}

public String getFileFileName() {
  return fileFileName;
}

public void setFileFileName(String fileFileName) {
  this.fileFileName = fileFileName;
}

public String getFileContentType() {
  return fileContentType;
}

public void setFileContentType(String fileContentType) {
  this.fileContentType = fileContentType;
}

3.在Action类中添加处理文件上传的方法

在Action类中,需要为上传文件新增一个处理方法,一般建议将该方法命名为doUpload()。在该方法中,需要定义一个FileInputStream对象,从而从上传的文件中读取数据,并将数据写入到服务器指定的文件中。具体代码如下:

public String doUpload() throws Exception {
    FileInputStream fileInputStream = new FileInputStream(file);
    String filePath = "D:\\" + fileFileName;
    FileOutputStream fileOutputStream = new FileOutputStream(filePath);
    byte[] buffer = new byte[1024];
    int len = 0;
    while ((len = fileInputStream.read(buffer)) > 0) {
        fileOutputStream.write(buffer,0,len);
    }
    fileInputStream.close();
    fileOutputStream.close();
    return SUCCESS;
}

4.通过表单页面上传文件

最后一步是编写上传文件的表单页面。表单中需要定义一个file类型的input标签,以便用户选择要上传的文件。具体代码如下:

<s:form action="doUpload" method="post" enctype="multipart/form-data">
  <s:file name="file" label="上传文件"/>
  <s:submit/>
</s:form>

三、Struts2文件上传功能的限制

为了保证系统的安全性和稳定性,通常需要对Struts2文件上传功能进行一些限制:

  • 限制上传文件的大小,防止上传过大的文件导致服务器崩溃;
  • 限制上传文件的类型,防止上传不受控制的文件类型,如webshell等;
  • 限制上传文件的数量,防止上传过多文件导致系统资源的浪费。

下面是实现文件上传限制的代码示例:

限制上传文件的大小

<interceptors>
  <interceptor name="myFileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor">
      <param name="maximumSize">1024000</param> <!-- 上传文件的最大大小为1024KB -->
  </interceptor>
  <interceptor-stack name="myDefault">
      <interceptor-ref name="defaultStack"/>
      <interceptor-ref name="myFileUpload"/>
  </interceptor-stack>
</interceptors>

限制上传文件的类型

<interceptors>
  <interceptor name="myFileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor">
      <param name="allowedTypes">image/jpeg,image/png</param> <!-- 上传文件的类型只允许为jpeg和png格式 -->
  </interceptor>
  <interceptor-stack name="myDefault">
      <interceptor-ref name="defaultStack"/>
      <interceptor-ref name="myFileUpload"/>
  </interceptor-stack>
</interceptors>

限制上传文件的数量

<interceptors>
  <interceptor name="myFileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor">
      <param name="maximumSize">1024000</param> <!-- 上传文件的最大大小为1024KB -->
      <param name="allowedTypes">image/jpeg,image/png</param> <!-- 上传文件的类型只允许为jpeg和png格式 -->
      <param name="maximumFiles">5</param> <!-- 上传的文件数量最多为5个 -->
  </interceptor>
  <interceptor-stack name="myDefault">
      <interceptor-ref name="defaultStack"/>
      <interceptor-ref name="myFileUpload"/>
  </interceptor-stack>
</interceptors>

四、示例

下面给出两个Struts2文件上传的示例:

示例1:上传单个文件

以上传一张图片为例来演示单个文件上传的过程。

  1. 编写上传文件的表单页面:
<s:form action="doUpload" method="post" enctype="multipart/form-data">
  <s:file name="file" label="上传图片"/>
  <s:submit/>
</s:form>
  1. 编写Action类代码
public class UploadAction extends ActionSupport {
    private File file;
    private String fileFileName;
    private String fileContentType;

    public File getFile() {
        return file;
    }

    public void setFile(File file) {
        this.file = file;
    }

    public String getFileFileName() {
        return fileFileName;
    }

    public void setFileFileName(String fileFileName) {
        this.fileFileName = fileFileName;
    }

    public String getFileContentType() {
        return fileContentType;
    }

    public void setFileContentType(String fileContentType) {
        this.fileContentType = fileContentType;
    }

    public String doUpload() throws Exception {
        FileInputStream fileInputStream = new FileInputStream(file);
        String filePath = "D:\\" + fileFileName;
        FileOutputStream fileOutputStream = new FileOutputStream(filePath);
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = fileInputStream.read(buffer)) > 0) {
            fileOutputStream.write(buffer,0,len);
        }
        fileInputStream.close();
        fileOutputStream.close();
        return SUCCESS;
    }
}

示例2:上传多个文件

以上传多张图片为例来演示多个文件上传的过程。

  1. 编写上传多个文件的表单页面:
<s:form action="doUpload" method="post" enctype="multipart/form-data">
  <s:file name="files" label="选择图片" multiple="true"/>
  <s:submit/>
</s:form>

注意:添加多个文件上传的功能需要在文件框中添加multiple="true"属性。

  1. 编写Action类代码
public class UploadAction extends ActionSupport {
    private List<File> files;
    private List<String> filesFileName;
    private List<String> filesContentType;

    public List<File> getFiles() {
        return files;
    }

    public void setFiles(List<File> files) {
        this.files = files;
    }

    public List<String> getFilesFileName() {
        return filesFileName;
    }

    public void setFilesFileName(List<String> filesFileName) {
        this.filesFileName = filesFileName;
    }

    public List<String> getFilesContentType() {
        return filesContentType;
    }

    public void setFilesContentType(List<String> filesContentType) {
        this.filesContentType = filesContentType;
    }

    public String doUpload() throws Exception {
        for (int i = 0; i < files.size(); i++) {
            FileInputStream fileInputStream = new FileInputStream(files.get(i));
            String filePath = "D:\\" + filesFileName.get(i);
            FileOutputStream fileOutputStream = new FileOutputStream(filePath);
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = fileInputStream.read(buffer)) > 0) {
                fileOutputStream.write(buffer,0,len);
            }
            fileInputStream.close();
            fileOutputStream.close();
        }
        return SUCCESS;
    }
}

五、总结

以上就是实现Struts2文件上传功能的完整攻略,主要涉及到Struts2文件上传的步骤、限制和示例。需要注意的是,在进行文件上传操作时,一定要注意对文件大小、文件类型和上传数量等方面进行限制,以确保系统的安全性和稳定性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SSH框架网上商城项目第13战之Struts2文件上传功能 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 微信小程序wx.request拦截器使用详解

    微信小程序wx.request拦截器使用详解 前言 在微信小程序中,我们有时需要对所有的 HTTP 请求进行统一的拦截或者处理,此时就需要使用到 wx.request 拦截器。在本文中,我们将详细介绍如何使用拦截器来实现统一的请求处理需求。 wx.request 拦截器介绍 wx.request 拦截器是在 2.10.0 版本中新增的功能,通过使用该功能,我…

    Java 2023年5月23日
    00
  • SpringBoot SpringSecurity 介绍(基于内存的验证)

    SpringBoot 集成 SpringSecurity + MySQL + JWT 附源码,废话不多直接盘SpringBoot已经为用户采用默认配置,只需要引入pom依赖就能快速启动Spring Security。目的:验证请求用户的身份,提供安全访问优势:基于Spring,配置方便,减少大量代码 内置访问控制方法 permitAll() 表示所匹配的 U…

    Java 2023年4月27日
    00
  • 如何使用Java安全管理框架?

    如何使用Java安全管理框架? Java安全管理框架是Java平台提供的一个安全机制,通过使用Java安全管理框架,开发者可以实现对Java应用程序的安全控制。 安装Java安全管理框架 Java安全管理框架已经集成到JDK中,无需另行安装。 配置Java安全管理策略文件 Java安全管理框架通过配置Java安全管理策略文件来实现安全控制。Java安全管理策…

    Java 2023年5月11日
    00
  • 混乱的Java日志体系及集成jar包梳理分析

    混乱的Java日志体系及集成jar包梳理分析是一篇旨在帮助Java开发者理解Java日志体系和集成jar包的文章。本文将围绕Java日志体系的问题、集成jar包的例子、分析Java日志框架的实现等多方面展开讲解。 一、Java日志体系的问题 在Java开发过程中,我们经常需要使用日志来帮助我们进行调试。但是,Java日志体系却十分混乱,不同的日志框架都有着自…

    Java 2023年5月19日
    00
  • Java实现拓扑排序的示例代码

    下面是Java实现拓扑排序的完整攻略: 1. 理解拓扑排序的概念 拓扑排序是一种常用于有向无环图(DAG)的算法,用于确定图中所有节点的相对顺序关系。具体来说,拓扑排序可以将一个DAG的所有节点线性排序,使得对于任何一条有向边(u, v),起点u在拓扑排序中都出现在终点v的前面。 2. 实现拓扑排序的算法 一个直接的想法是通过深度优先搜索(DFS)来实现拓扑…

    Java 2023年5月19日
    00
  • Java中字节流和字符流的理解(超精简!)

    了解Java中字节流和字符流的区别和使用场景,是Java IO编程的基础。下面我们来详细讲解一下这个问题。 1. 什么是Java中的字节流和字符流? Java IO流分为字节流和字符流两种类型,它们的差别在于输入输出流所处理的数据单元不同:字节流以字节(8 bit)为单位,而字符流以字符为单位(Java中一个字符占2个字节)。 2. Java中字节流 字节流…

    Java 2023年5月27日
    00
  • 深入浅析 Spring Security 缓存请求问题

    深入浅析 Spring Security 缓存请求问题 问题概述 在使用 Spring Security 进行权限管理时,我们通常会遇到「页面缓存」或「接口缓存」的问题。这里的缓存指的是浏览器或客户端针对请求结果的缓存。 通常情况下,为了确保系统的安全性,我们不希望缓存敏感数据,例如用户信息、权限信息等。但是,当我们进行权限验证时,如果对同一个请求进行多次验…

    Java 2023年5月20日
    00
  • Java中I/O输入输出的深入讲解

    Java中I/O输入输出的深入讲解 什么是I/O I/O(Input/Output)指的是数据的输入和输出,是计算机与程序外部世界进行信息交互的方式之一。在Java中,I/O被视为一种Java API,提供了许多与文件、网络和其他I/O设备进行数据输入和输出的类和方法。 I/O的主要类型 字节流 字节流(Byte Stream)以字节为单位进行操作,可以读写…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部