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十大排序算法之计数排序详解

    JAVA十大排序算法之计数排序详解 计数排序概述 计数排序是一种非比较排序算法,它的时间复杂度为O(n+k),其中k是整数的范围。和桶排序一样,计数排序假设输入的数组中元素是平均分布的,但它不适用于元素范围过大的情况。 计数排序算法的思想:对于给定的一组数据,统计出小于等于这组数据中每个数的个数,利用这个统计信息,直接将每个元素放到它在输出数组中的位置上,从…

    Java 2023年5月19日
    00
  • 详解SpringBoot简化配置分析总结

    详解SpringBoot简化配置分析总结 Spring Boot是一个流行的Java框架,可以帮助开发人员快速构建和部署应用程序。Spring Boot通过简化配置和提供自动配置来提高开发效率。本文将详细讲解Spring Boot简化配置的原理和实现,并提供两个示例,演示如何使用Spring Boot简化配置。 1. Spring Boot简化配置的原理 S…

    Java 2023年5月14日
    00
  • Springboot通用mapper和mybatis-generator代码示例

    下面是关于“Springboot通用mapper和mybatis-generator代码示例”的完整攻略: 一、什么是Springboot通用mapper和mybatis-generator 1. Springboot通用mapper Springboot通用mapper是一款能够提高数据访问的工具,主要用于深度整合Mybatis和Spring Data J…

    Java 2023年5月20日
    00
  • JVM教程之Java代码编译和执行的整个过程(二)

    JVM教程之Java代码编译和执行的整个过程(二) 在第一部分中,我们讲解了Java代码编译和执行的基本过程,包括编译器、虚拟机、类加载器等。本篇文章将更加深入地介绍这个过程的细节和优化技巧,同时提供两个实际示例。 Java源代码编译成字节码文件 在上一篇文章中,我们列出了编译Java源代码的基本命令: javac HelloJava.java 这个命令将生…

    Java 2023年5月26日
    00
  • IntelliJ IDEA设置JVM运行参数的操作方法

    下面是详细的 “IntelliJ IDEA设置JVM运行参数的操作方法”攻略: 什么是JVM运行参数? JVM运行参数指定了在Java应用程序内部运行时,JVM使用的命令行参数。这些参数可以用于调整JVM的行为和性能,例如内存分配,垃圾回收策略,线程数等。在Java应用程序中,可以通过设置JVM运行参数更好地配置JVM,以来优化应用的性能和稳定性。 Inte…

    Java 2023年5月19日
    00
  • Springboot hibernate-validator 6.x快速校验示例代码

    下面是“Springboot hibernate-validator 6.x快速校验示例代码”的完整攻略: 1. 关于Springboot和Hibernate-validator 1.1 Springboot Spring Boot是一个基于Spring框架的快速应用开发框架,它通过约定大于配置的方式,实现了最小化配置的功能,使得开发者可以更加专注于业务逻辑…

    Java 2023年5月20日
    00
  • 详解美团实现搜索关键词自动匹配功能的方法

    以下是详解美团实现搜索关键词自动匹配功能的方法的完整攻略: 介绍 美团实现搜索关键词自动匹配功能的方法可分为两个方面:前端交互和后端搜索引擎的支持,下面将对这两个方面一一解释。 前端交互 前端交互实现起来比较简单,主要分为以下两个步骤: 1. 给输入框添加键盘监听事件 这个步骤的意思是监听用户在输入框中的输入,并将输入的内容发送到后端搜索引擎进行匹配。代码如…

    Java 2023年5月19日
    00
  • cookie、session和java过滤器结合实现登陆程序

    实现登陆程序需要用到cookie、session和java过滤器,下面是实现登陆程序的完整攻略: 1.理解cookie和session Cookie是一小段文本信息,存在客户端浏览器上,用于存储一些关于用户的信息。一个浏览器对于同一个cookie的请求都会带上这个cookie。 Session是一种在服务器端保存用户数据的解决方案。Session的工作流程为…

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