Struts 框架 之 文件上传下载案例

简介:

Struts 框架 文件上传

  1. 先准备 Struts 环境 (我使用的是struts 2.3.4版本)

    导jar包:

      jar包的具体作用在前面的文章有讲。

    

    配置 web.xml

复制代码
    <!-- Struts核心拦截器 -->
    <filter> <filter-name>Struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>Struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
复制代码

    然后开始开发action 

    上传action类:FileUpload  src/com.yif.fileupload

    jsp : <input type="file" name="file1">

    action类中使用  File file1 和 jsp中名字要相同

    file1FileName  file1ContentType 中的file1 需要与jsp中对应

复制代码
import java.io.File;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class FileUpload extends ActionSupport {

    // 对应表单:<input type="file" name="file1">
    private File file1;
    // 文件名
    private String file1FileName;
    // 文件的类型(MIME)
    private String file1ContentType;

    public void setFile1(File file1) {
        this.file1 = file1;
    }

    public void setFile1FileName(String file1FileName) {
        this.file1FileName = file1FileName;
    }

    public void setFile1ContentType(String file1ContentType) {
        this.file1ContentType = file1ContentType;
    }

    @Override
    public String execute() throws Exception {
        /****** 拿到上传的文件,进行处理 ******/
        // 把文件上传到upload目录

        // 获取上传的目录路径
        String path = ServletActionContext.getServletContext().getRealPath(
                "/upload");
        // 创建目标文件对象
        File destFile = new File(path, file1FileName);
        // 把上传的文件,拷贝到目标文件中
        FileUtils.copyFile(file1, destFile);

        return SUCCESS;
    }
}
复制代码

 

    开发下载文件 action类: DownAction  src/com.yif.fileupload

    list方法 将上传文件的路径下的文件 放在list中写道请求中。

复制代码
package com.yif.fileupload;

import java.io.File;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

public class DownAction extends ActionSupport {
    
    /*************1. 显示所有要下载文件的列表*********************/
    public String list() throws Exception {
        //得到upload目录路径
        String path = ServletActionContext.getServletContext().getRealPath("/upload");
        // 目录对象
        File file  = new File(path);
        // 得到所有要下载的文件的文件名
        String[] fileNames =  file.list();
        // 保存
        ActionContext ac = ActionContext.getContext();
        // 得到代表request的map (第二种方式)
        Map<String,Object> request= (Map<String, Object>) ac.get("request");
        request.put("fileNames", fileNames);
        return "list";
    }
    
    /*************2. 文件下载*********************/
    private String fileName;
    public void setFileName(String fileName) {
        // 处理传入的参数中问题(get提交)
        try {
            fileName = new String(fileName.getBytes("ISO8859-1"),"UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        // 把处理好的文件名,赋值
        this.fileName = fileName;
    }
    
    //2. 下载提交的业务方法 (在struts.xml中配置返回stream)
    public String down() throws Exception {
        return "download";
    }
    
    // 3. 返回文件流的方法
    public InputStream getAttrInputStream(){
        return ServletActionContext.getServletContext().getResourceAsStream("/upload/" + fileName);
    }
    
    // 4. 下载显示的文件名(浏览器显示的文件名)
    public String getDownFileName() {
        // 需要进行中文编码
        try {
            fileName = URLEncoder.encode(fileName, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException(e);
        }
        return fileName;
    }

    
}
复制代码

 

    写upload.xml    src/com.yif.fileupload

    下载配置详细:

 

    <result name="download" type="stream"> <!-- 运行下载的文件的类型:指定为所有的二进制文件类型 --> <param name="contentType">application/octet-stream</param> <!-- 对应的是Action中属性: 返回流的属性【其实就是getAttrInputStream()】 --> <param name="inputName">attrInputStream</param> <!-- 下载头,包括:浏览器显示的文件名 --> <param name="contentDisposition">attachment;filename=${downFileName}</param> <!-- 缓冲区大小设置 --> <param name="bufferSize">1024</param>     </result>

 

复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
    <package name="upload_" extends="struts-default">
        <!-- 注意: action 的名称不能用关键字"fileUpload" -->
        <action name="fileUploadAction" class="com.yif.fileupload.FileUpload">
            <!-- 限制运行上传的文件的类型 -->
            <interceptor-ref name="defaultStack">
                <!-- 限制运行的文件的扩展名 -->
                <param name="fileUpload.allowedExtensions">txt,jpg,jar</param>
                <!-- 限制运行的类型 【与上面同时使用,取交集】 <param name="fileUpload.allowedTypes">text/plain</param> -->
            </interceptor-ref>
            <result name="success">/e/success.jsp</result>
            <!-- 配置错误视图 -->
            <result name="input">/e/error.jsp</result>
        </action>
        <action name="down_*" class="com.yif.fileupload.DownAction"
            method="{1}">
            <!-- 列表展示 -->
            <result name="list">/e/list.jsp</result>
            <!-- 下载操作 -->
            <result name="download" type="stream">
                <!-- 运行下载的文件的类型:指定为所有的二进制文件类型 -->
                <param name="contentType">application/octet-stream</param>
                <!-- 对应的是Action中属性: 返回流的属性【其实就是getAttrInputStream()】 -->
                <param name="inputName">attrInputStream</param>

                <!-- 下载头,包括:浏览器显示的文件名 -->
                <param name="contentDisposition">attachment;filename=${downFileName}</param>
                <!-- 缓冲区大小设置 -->
                <param name="bufferSize">1024</param>
            </result>
        </action>
    </package>
</struts>
复制代码

 

    配置struts.xml  src/struts.xml

复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
    "http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
    <include file="com/yif/fileupload/upload.xml"></include>
</struts>
复制代码

 

    upload.jsp页面(前端采用Bootstrap框架)   WebRoot/e/upload.jsp

复制代码
<body style="background-color:#ccc;padding:50px;">
    <div class="container" style="background-color:#fff;padding:50px;">
        <form class="form-horizontal"
            action="${pageContext.request.contextPath }/fileUploadAction"
            method="post" enctype="multipart/form-data">
            <h1 class="page-header">文件上传</h1>

            <div class="form-group">
                <label for="name" class="col-sm-2 control-label">用户名:</label>
                <div class="col-sm-5">
                    <input type="text" id="name" class="form-control" placeholder="用户名"
                        name="userName">
                </div>
            </div>

            <div class="form-group">
                <label class="col-sm-2 control-label">文件:</label>
                <div class="col-sm-10">
                    <input type="file" name="file1">
                </div>
            </div>

            <div class="form-group">
                <div class="col-sm-2 col-sm-offset-2">
                    <input type="submit" class="btn btn-lg btn-primary btn-block"
                        value="上传"></input>
                </div>
            </div>
        </form>
    </div>
</body>
复制代码

 

    list.jsp页面                WebRoot/e/list.jsp

复制代码
<body style="background-color:#ccc;padding:50px;">
    <h1 class="page-header">下载列表</h1>
    <table class="table table-hover">
        <tr>
            <td class="active">编号</td>
            <td class="success">文件名</td>
            <td class="warning">操作</td>
        </tr>
        <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
        <c:forEach var="fileName" items="${fileNames}" varStatus="vs">
            <tr>
                <td>${vs.count }</td>
                <td>${fileName }</td>
                <td>
                    <!-- 构建一个url --> <c:url var="url" value="down_down">
                        <c:param name="fileName" value="${fileName}"></c:param>
                    </c:url> <a href="${url }">下载</a></td>
            </tr>
        </c:forEach>
    </table>
</body>
复制代码

 

    实现效果:

    error.jsp  success.jsp略

目录
相关文章
|
6月前
|
SQL 算法 调度
Flink批处理自适应执行计划优化
本文整理自阿里集团高级开发工程师孙夏在Flink Forward Asia 2024的分享,聚焦Flink自适应逻辑执行计划与Join算子优化。内容涵盖自适应批处理调度器、动态逻辑执行计划、自适应Broadcast Hash Join及Join倾斜优化等技术细节,并展望未来改进方向,如支持更多场景和智能优化策略。文章还介绍了Flink UI调整及性能优化措施,为批处理任务提供更高效、灵活的解决方案。
205 0
Flink批处理自适应执行计划优化
|
数据采集 人工智能 自然语言处理
中科大联合华为诺亚提出Entropy Law,揭秘大模型性能、数据压缩率以及训练损失关系
【8月更文挑战第14天】中科大与华为联合提出的Entropy Law理论,揭示了大语言模型性能与数据压缩率及训练损失的关系,指出低压缩率和高数据一致性有利于提升模型效能。基于此,开发出ZIP数据选择算法,通过多阶段贪婪策略优选低冗余样本,有效提高了模型训练效率和性能,同时降低了计算成本。这一成果为优化大模型训练提供了新途径。论文详述请见链接:https://arxiv.org/pdf/2407.06645。
282 65
|
5月前
|
自然语言处理 搜索推荐 机器人
合力亿捷云客服系统:2025年大模型如何重塑全渠道对话体验
2025年,以DeepSeek等大模型为核心的智能客服系统,突破传统效率瓶颈,通过全渠道整合、多模态交互、个性化服务与情感智能,重构企业客户互动模式。从机械应答到认知共情,从单一文本到多维交互,大模型赋能客服系统成为企业价值创造的战略资产,推动客户服务迈向智能化新纪元。
225 2
|
6月前
|
人工智能 Java 数据库
飞算JavaAI vs 文心快码,面对复杂需求,谁的代码精准度更胜一筹?
在数字化浪潮中,Java 作为核心编程语言,各类开发工具不断涌现。百度文心快码与飞算 Java AI 凭借先进的人工智能技术成为焦点。综合对比数据库表设计、代码完整度及用户体验,二者谁更胜一筹?
|
Prometheus 监控 Cloud Native
【监控】prometheus传统环境监控告警常用配置
【监控】prometheus传统环境监控告警常用配置
【监控】prometheus传统环境监控告警常用配置
|
10月前
|
人工智能 自然语言处理 搜索推荐
🤖【多Agent大爆炸】——灵活调用与实践指南,解锁AI协作新技能!
本文深入探讨了单Agent与多Agent在不同场景下的应用及优势,通过实例讲解多Agent如何实现高效协作,涵盖智能物流、教育、医疗等多个领域的实际应用,旨在帮助开发者掌握多Agent系统的调用与实践技巧。
693 5
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
探索人工智能的无限可能:技术前沿与应用实践
【10月更文挑战第23天】探索人工智能的无限可能:技术前沿与应用实践
|
10月前
|
监控 安全 网络安全
|
11月前
|
缓存 监控 测试技术
掌握容器化持续集成/持续部署(CI/CD)的最佳实践
【10月更文挑战第8天】本文介绍了容器化持续集成/持续部署(CI/CD)的最佳实践,涵盖容器化CI/CD的概念、优势和实施步骤。通过使用容器技术,可以实现环境一致性、快速迭代和易于扩展,提高软件开发的效率和可靠性。文章还详细讨论了编写高效的Dockerfile、自动化测试、安全性、监控和日志管理等方面的最佳实践。
|
12月前
|
JSON 算法 数据安全/隐私保护
brida和frida练习hook逆向技术【中】
本文介绍了如何在未加壳、未混淆的 APK 中定位并破解加密算法,并使用 Burp 插件 autoDecoder 进行自动化加解密及口令爆破。文中详细描述了从反编译到配置插件的全过程,并提供了关键要素如 AES 算法、SECRET_KEY 和 Base64 编码的具体应用。此外,还展示了如何调整并发数以提高爆破成功率。
190 0
brida和frida练习hook逆向技术【中】

热门文章

最新文章