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 中Flyway的使用详解

    Java 中 Flyway 的使用详解 什么是 Flyway Flyway 是一款开源的数据库版本控制工具,采用简单易用的方式为数据库提供更好的管理。Flyway 是用 Java 语言编写的并且支持多种主流数据库,如 MySQL、PostgreSQL、Oracle 等。 Flyway 的工作原理如下: 创建一个名为 flyway_schema_history…

    Java 2023年5月20日
    00
  • Spring data elasticsearch使用方法详解

    Spring Data Elasticsearch使用方法详解 什么是Spring Data Elasticsearch Spring Data Elasticsearch是基于Spring Data的一个Elasticsearch组件,它提供了一系列的API以便于我们操作Elasticsearch。Spring Data Elasticsearch使得Sp…

    Java 2023年5月20日
    00
  • Spring Security OAuth2 授权码模式的实现

    下面给出 Spring Security OAuth2 授权码模式的实现攻略。 什么是授权码模式 授权码模式(Authorization Code Grant)是OAuth2.0标准中最为常用的一种流程,在实现 OAuth2.0 授权功能时,授权码模式是最稳妥的一种方式。 授权码模式的具体流程如下:1. 第三方应用向用户请求授权,用户同意授权后,第三方应用获…

    Java 2023年5月20日
    00
  • Struts2实现文件上传时显示进度条功能

    请看下面的详细讲解: 1. 背景和思路 在Java Web开发中,文件上传功能是一个非常常见而且常用的功能,而文件上传时的进度条功能可以让用户更加直观地看到上传的进程和速度,大大提升了用户体验。 在Struts2框架中,想要实现文件上传并显示进度条功能,通常需要借助第三方插件或者库。该攻略介绍一种基于apache.commons包中的FileUpload组件…

    Java 2023年5月20日
    00
  • 基于java实现的ECC加密算法示例

    题目中提到了“基于java实现的ECC加密算法示例”,因此我们需要对这个话题展开讲解,下面是详细的攻略: 什么是ECC加密算法? ECC(Elliptic Curve Cryptography)椭圆曲线加密算法,是在椭圆曲线上实现的加密算法。通常情况下,比如RSA加密算法,密钥长度越长,加密的强度也越强。但是,ECC加密算法却有一个比较特别的地方,那就是在密…

    Java 2023年5月19日
    00
  • java实现文件保存到本地的方法

    Java 实现文件保存到本地的方法可以通过以下步骤来实现。 第一步:准备保存文件的本地目录 在 Java 代码中,我们需要提前准备好一个本地保存文件的目录,可以使用 File 类来生成目录,示例代码如下: File directory = new File("D:/files"); if(!directory.exists()){ dir…

    Java 2023年5月20日
    00
  • java实现死锁的示例代码

    我来为你详细讲解一下如何实现Java中的死锁。 什么是死锁 死锁是指多个线程相互等待对方释放资源,但是这些线程都不会主动释放资源,就形成了一种相互等待的死局。 死锁示例代码1 以下是一个简单的死锁示例代码,代码通过两个线程互相调用对方已经拥有的同步锁,来形成死锁现象。 public class DeadLockDemo { private static Ob…

    Java 2023年5月19日
    00
  • SrpingDruid数据源加密数据库密码的示例代码

    首先我们需要明确什么是SpringDruid数据源,以及为什么需要加密数据库密码。 SpringDruid数据源是一种基于Spring框架和阿里巴巴德鲁伊连接池的数据源,它能够提高数据库的连接性能、可用性和稳定性。 在实际应用中,我们通常需要在配置文件中配置数据库连接信息,包括数据库用户名和密码。然而,这样做存在一定风险,因为配置文件可能会被非授权的人员获取…

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