java中struts2实现文件上传下载功能

下面是java中struts2实现文件上传下载功能的完整攻略:

一、文件上传功能的实现

1. 安装文件上传插件

在struts2中实现文件上传功能需要依赖文件上传插件,可以通过以下方式进行安装:

  1. pom.xml中加入以下依赖:
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>${struts.version}</version>
</dependency>
<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.11.0</version>
</dependency>

其中struts.version是struts的版本号,可以自己设置。

  1. 在struts.xml中配置文件上传的拦截器:
<interceptors>
    <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor">
        <param name="maximumSize">20971520</param><!-- 20MB -->
    </interceptor>
    <interceptor-stack name="defaultStack">
        <interceptor-ref name="fileUpload"/>
        <interceptor-ref name="params">
            <param name="excludeParams">.*</param>
        </interceptor-ref>
        <interceptor-ref name="servletConfig"></interceptor-ref>
        <interceptor-ref name="prepare"></interceptor-ref>
        <interceptor-ref name="chain"></interceptor-ref>
        <interceptor-ref name="debugging"></interceptor-ref>
        <interceptor-ref name="profiling"></interceptor-ref>
        <interceptor-ref name="scopedModelDriven"></interceptor-ref>
        <interceptor-ref name="modelDriven"></interceptor-ref>
        <interceptor-ref name="fileUpload"></interceptor-ref>
        <interceptor-ref name="checkbox"></interceptor-ref>
        <interceptor-ref name="multiselect"></interceptor-ref>
        <interceptor-ref name="staticParams"></interceptor-ref>
        <interceptor-ref name="actionMappingParams"></interceptor-ref>
        <interceptor-ref name="params"></interceptor-ref>
        <interceptor-ref name="conversionError"></interceptor-ref>
    </interceptor-stack>
</interceptors>

2. 实现文件上传的Action

  1. 创建一个实体类FileItem:
public class FileItem {
    private String fileName;  // 文件名
    private String fileType;  // 文件类型
    private String filePath;  // 文件存放路径

    // 省略Getter和Setter
}
  1. 创建文件上传的Action类:
public class FileUploadAction extends ActionSupport {
    private static final long serialVersionUID = -3192370127539117633L;
    private File file;  // 上传的文件,用File对象接收
    private String fileContentType;  // 文件类型
    private String fileFileName;  // 文件名

    // 注意:这里的变量名要与struts.xml中的参数名保持一致
    private List<FileItem> fileItems;  // 已上传文件列表

    // 省略Getter和Setter

    public String upload() {
        // 获取上传文件的保存路径
        String savePath = ServletActionContext.getServletContext().getRealPath("/upload");

        // 若保存路径不存在,则创建该路径
        File fileDir = new File(savePath);
        if (!fileDir.exists()) {
            fileDir.mkdirs();
        }

        // 生成UUID作为文件名,防止重名
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        String ext = fileFileName.substring(fileFileName.lastIndexOf("."));  // 获取文件扩展名
        File targetFile = new File(savePath, uuid + ext);

        try {
            FileUtils.copyFile(file, targetFile);  // 复制上传的文件到目标文件
            addActionMessage("上传成功!");
        } catch (IOException e) {
            e.printStackTrace();
        }

        return SUCCESS;
    }

    /**
     * 获取已上传的文件列表
     */
    public String fileList() {
        String savePath = ServletActionContext.getServletContext().getRealPath("/upload");
        File file = new File(savePath);
        File[] files = file.listFiles();

        fileItems = new ArrayList<>();
        if (files != null) {
            for (File f : files) {
                FileItem fi = new FileItem();
                fi.setFileName(f.getName());
                fi.setFilePath(f.getAbsolutePath());
                fi.setFileType(f.getName().substring(f.getName().lastIndexOf(".") + 1));
                fileItems.add(fi);
            }
        }

        return SUCCESS;
    }

}
  1. 在struts.xml中配置文件上传的action:
<action name="fileupload" class="org.example.FileUploadAction" method="upload">
    <result name="success">/WEB-INF/views/success.jsp</result>
    <result name="input">/WEB-INF/views/input.jsp</result>
</action>

3. 实现文件上传的页面

  1. 创建上传文件的表单页面input.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>文件上传示例</title>
</head>
<body>
<s:form action="fileupload" method="post" enctype="multipart/form-data">
    <s:file name="file" label="选择文件:"/>
    <s:submit value="上传"/>
</s:form>
</body>
</html>
  1. 创建上传成功页面success.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>上传成功</title>
</head>
<body>
上传成功!
<s:a href="filelist.action">查看已上传的文件</s:a>
</body>
</html>

4. 文件上传功能的示例演示

在浏览器中访问/upload/input.jsp,选择一个文件并点击“上传”按钮即可完成文件上传,上传成功后会跳转到上传成功的页面。点击“查看已上传的文件”链接可以进入到已上传文件列表页面。

二、文件下载功能的实现

1. 实现文件下载的Action

  1. 创建文件下载的Action类:
public class FileDownloadAction extends ActionSupport {
    private static final long serialVersionUID = 1L;
    private String filePath;  // 文件路径

    // 省略Getter和Setter

    public InputStream getFileStream() {
        return ServletActionContext.getServletContext().getResourceAsStream(filePath);
    }

    /**
     * 下载文件的方法
     * @return
     * @throws Exception
     */
    public String download() throws Exception {
        return SUCCESS;
    }
}
  1. 在struts.xml中配置文件下载的action:
<action name="filedownload" class="org.example.FileDownloadAction" method="download">
    <result name="success" type="stream">
        <param name="contentType">application/octet-stream</param>
        <param name="inputName">fileStream</param>
        <param name="contentDisposition">attachment;filename=${fileName}</param>
        <param name="bufferSize">1024</param>
    </result>
</action>

其中,param标签的contentDisposition属性指定了下载文件时的文件名,${fileName}是在action中设置的文件名。

2. 实现文件下载的页面

  1. 创建文件下载链接的列表页filelist.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>文件上传示例</title>
</head>
<body>
<table>
    <thead>
    <tr>
        <th>文件名</th>
        <th>文件类型</th>
        <th>操作</th>
    </tr>
    </thead>
    <tbody>
    <s:iterator value="fileItems">
        <tr>
            <td><s:property value="fileName"/></td>
            <td><s:property value="fileType"/></td>
            <td><s:a href="filedownload.action?filePath=<s:property value='filePath'/>&fileName=<s:property value='fileName'/>">下载</s:a></td>
        </tr>
    </s:iterator>
    </tbody>
</table>
</body>
</html>

其中,<s:a>标签中的filedownload.action是文件下载的action,filePath是下载文件的路径,而fileName则是下载时的文件名。

3. 文件下载功能的示例演示

在浏览器中访问/filelist.action,点击某个文件的“下载”链接,即可下载该文件到本地。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java中struts2实现文件上传下载功能 - Python技术站

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

相关文章

  • 记一次线程爆满导致服务器崩溃的问题排查及解决

    那么我们就来详细讲解一下如何排查和解决线程爆满导致服务器崩溃的问题。 问题描述 我们的公司网站最近出现了一个严重的问题,由于线程爆满导致服务器崩溃,影响了服务的正常运行。经过初步排查发现,该问题主要集中在某个页面请求过程中,而其他页面的请求则没有出现问题。但是由于该问题不易复现,因此需要更加深入地排查问题。 排查过程 监控系统 首先,我们需要在服务器上安装监…

    Java 2023年5月26日
    00
  • SpringBoot自动配置与启动流程详细分析

    下面是SpringBoot自动配置与启动流程的详细分析。 1. SpringBoot自动配置流程 1.1 前置知识 在了解SpringBoot自动配置流程之前,需要掌握以下几个核心概念: Spring Framework:Spring Framework是一款非常流行的Java企业级应用开发框架,提供了众多优秀的特性和类库。SpringBoot是在Sprin…

    Java 2023年5月15日
    00
  • WIN7系统JavaEE(java)环境配置教程(一)

    WIN7系统JavaEE(java)环境配置教程(一) 本教程将演示如何在WIN7系统上配置JavaEE(java)开发环境,包括JDK、Eclipse和Tomcat的安装与配置。 第一步:JDK的安装 下载JDK安装包,网址:Oracle官方网站 双击运行安装包,按照提示安装JDK。 配置环境变量,将JDK的bin目录加入系统环境变量中。如下: 属性 -&…

    Java 2023年5月23日
    00
  • Java 数据结构与算法系列精讲之红黑树

    红黑树 简介 红黑树是一种自平衡二叉搜索树,它是被广泛使用的一种数据结构,在计算机领域中用于实现高效的查找、插入和删除操作。其名字的由来是因为每个节点都有一个被标记为红色或黑色的属性,又因为它是二叉搜索树,因此在插入、删除操作后,它会自动调整以保持平衡状态。 红黑树的定义 红黑树最重要的两个属性是: 每个节点或者是黑色,或者是红色。 根节点是黑色。 每个叶节…

    Java 2023年5月26日
    00
  • 详解java自定义类

    详解Java自定义类 在Java中,我们可以使用自定义类创建对象并使用。这些对象可以有自己的属性和方法。 创建一个Java自定义类 创建一个Java自定义类需要遵循以下步骤: 用 class 关键字定义类名。类名必须以大写字母开头,遵循驼峰命名法。 在类中定义属性。属性可以是任何数据类型,包括用户自定义类型。属性定义应该在方法之前。 在类中定义方法。方法是可…

    Java 2023年5月20日
    00
  • 详解Java快速上手用户后台管理系统

    详解Java快速上手用户后台管理系统 简介 本文将详细讲解使用Java语言开发基本用户后台管理系统的步骤和注意事项,适合有一定Java基础的开发者学习。 步骤 步骤一:安装开发环境 首先需要安装JDK、IDE和相关依赖库,推荐使用Eclipse、IntelliJ IDEA、NetBeans等常用的开发工具。 步骤二:创建项目 在IDE中创建一个Java We…

    Java 2023年5月23日
    00
  • Java Apache POI报错“EncryptedDocumentException”的原因与解决办法

    “EncryptedDocumentException”是Java的Apache POI类库中的一个异常,通常由以下原因之一引起: 文档加密:如果文档被加密,则可能会出现此异常。例如,可能会尝试打开受密码保护的Excel文档。 以下是两个实例: 例1 如果文档被加密,则可以尝试使用正确的密码以解决此问题。例如,在Java中,可以使用以下代码: FileInp…

    Java 2023年5月5日
    00
  • Java数组与字符串深入探索使用方法

    Java数组与字符串深入探索使用方法 一、数组 1. 定义 Java数组是一个可以容纳固定数量元素的容器,它可以被认为是一个有序的元素列表。数组中的每个元素都有唯一的索引号来标识它们在数组中的位置。数组可以是任何类型,包括基本类型和引用类型。 2. 声明 在Java中,声明一个数组需要指定如下信息:- 数组的类型:数组中元素的类型(int、double、St…

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