Struts2系列之文件上传下载

本文介绍如何在Struts2框架中实现文件的上传与下载功能。文章详细讲解了文件上传所需的表单配置及Action处理流程,并展示了如何通过Struts2的拦截器设置文件大小与格式限制。此外,还介绍了文件下载的实现方法,包括如何处理中文文件名及设置正确的响应头。

文件上传的必要条件

1. 表单的method 必须是post

2. 表单提供enctype必须是mulipart/from-data

3.提供input type=”file”类型上传输入域

注意:如果是大文件浏览器也会拦截不让上传

在struts2中文件上传是由fileUpload拦截器完成的

单文件上传:
jsp:

<head>
    <title>单文件上传</title>
</head>
<body>
<%--文件上传必要的条件--%>
<%--1, 要有一个表单 方式要是post请求--%>
<%--2, enctype="multipart/form-data--%>
<%--3, <input type="file" name="photo">--%>
<s:fielderror/>
<s:actionerror/>
<form action="${pageContext.request.contextPath}/upload.action" method="post" enctype="multipart/form-data">

    姓名:<input type="text" name="username">
    头像:<input type="file" name="photo">
    <input type="submit" value="上传">

</form>

action:

public class SingleUploadAction extends ActionSupport {

    private String username;
    private File photo;//必须是file类型,名字对应着表单的上传输入域
    private String photoFileName;//固定的写法:XXXFileName
    private String photoContentType;//上传文件的MIME类型,固定写法


    public  String upload() throws IOException {
        System.out.println(username + "fkdsjf");
        System.out.println(photoContentType);
        ServletContext servletContext = ServletActionContext.getServletContext();
        //获得存放文件的真是目录
        String directory = servletContext.getRealPath("/file");
        //构建目标文件
        File target = new File(directory,photoFileName);
        //写入目标文件
        FileUtils.copyFile(photo, target);
        return SUCCESS;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public File getPhoto() {
        return photo;
    }

    public void setPhoto(File photo) {
        this.photo = photo;
    }

    public String getPhotoFileName() {
        return photoFileName;
    }

    public void setPhotoFileName(String photoFileName) {
        this.photoFileName = photoFileName;
    }

    public String getPhotoContentType() {
        return photoContentType;
    }

    public void setPhotoContentType(String photoContentType) {
        this.photoContentType = photoContentType;
    }

}

struts.xml

  <!--修改文件的大小 (10M 1024*1024*10)-->
    <constant name="struts.multipart.maxSize" value="10485760"/>
    <!--由于我们在不被允许的格式中要显示用户可以看得懂的文字 可以写一个配置文件 constant name="国际化的一种方式"-->
    <constant name="struts.custom.i18n.resources" value="fileUploadMessage"/>

    <package name="p1" extends="struts-default">
        <action name="upload" class="com.wangyjie.struts.fileupload.SingleUploadAction" method="upload">
          <!--因为在默认的拦截器中  直接引用就可以了-->
           <interceptor-ref name="defaultStack">
               <!--限制文件后缀-->
               <param name="fileUpload.allowedExtensions">.jsp, png</param>
           </interceptor-ref>

            <result name="success">/success.jsp</result>
            <result name="input">/singleFileUpload.jsp</result>
        </action>
    </package>



文件下载

结果集类型的使用 stream

• 动作类的书写规范 : inputStream / fileName

•struts.xml中action result的type=“stream”两个参数:

◦ inputName[输入流的属性名]

◦ contentDisposition=attachment;filename=${fileName}[通知浏览器以下载形式打开]

action:

package com.wangyjie.struts.down;

import com.opensymphony.xwork2.ActionSupport;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import org.apache.struts2.ServletActionContext;
import sun.misc.BASE64Encoder;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;

/**
 * Created by dllo on 17/7/7.
 */
public class downLoadAction extends ActionSupport {

    //定义一个输入流
    private InputStream inputStream;
    private String imageFileName;

    public String getImageFileName() {

        return imageFileName;
    }

    public void setImageFileName(String imageFileName) {
        this.imageFileName = imageFileName;
    }

    public InputStream getInputStream() {
        return inputStream;
    }

    public void setInputStream(InputStream inputStream) {
        this.inputStream = inputStream;
    }

    public String download() throws IOException {

        //实现下载.给inputStream赋值
        String realPath = ServletActionContext.getServletContext().getRealPath("/杰哥.jpg");
        //获取文件名
//        imageFileName = FilenameUtils.getName(realPath);
        imageFileName = filenameEncoding(FilenameUtils.getName(realPath), ServletActionContext.getRequest(),ServletActionContext.getResponse());
        inputStream = new FileInputStream(realPath);
//        FileUtils.getFile(realPath).getName();
        return SUCCESS;
    }

//中文处理
    public String filenameEncoding(String filename, HttpServletRequest request, HttpServletResponse response) throws IOException {
        String agent = request.getHeader("User-Agent"); //获取浏览器的类型    System.out.println(agent);
        if (agent.contains("Firefox")) {
            BASE64Encoder base64Encoder = new BASE64Encoder();
            filename = "=?utf-8?B?"                + base64Encoder.encode(filename.getBytes("utf-8"))
                    + "?=";
        } else if(agent.contains("MSIE")) {
            filename = URLEncoder.encode(filename, "utf-8");
        } else if (agent.contains("Safari")){
            filename = new String(filename.getBytes("UTF-8"),"ISO8859-1");
        }else {
            filename = URLEncoder.encode(filename, "utf-8");
        }
        return filename;
    }

}

struts.xml

   <package name="downLoad" extends="struts-default">
       <action name="download" class="com.wangyjie.struts.down.downLoadAction" method="download">
           <result name="success" type="stream">
               <!--指定动作类中的输入流,属性名-->
               <param name="inputName">inputStream</param>
               <!--通知浏览器以下载的形式打开-->
               <!--文件名动态处理 添加 fileName 属性-->
               <param name="contentDisposition">attachment;filename=${imageFileName}</param>
           </result>
       </action>
   </package>
下载前可以先看下教程 https://pan.quark.cn/s/a426667488ae 标题“仿淘宝jquery图片左右切换带数字”揭示了这是一个关于运用jQuery技术完成的图片轮播机制,其特色在于具备淘宝在线平台普遍存在的图片切换表现,并且在整个切换环节中会展示当前图片的序列号。 此类功能一般应用于电子商务平台的产品呈现环节,使用户可以便捷地查看多张商品的照片。 说明中的“NULL”表示未提供进一步的信息,但我们可以借助标题来揣摩若干核心的技术要点。 在构建此类功能时,开发者通常会借助以下技术手段:1. **jQuery库**:jQuery是一个应用广泛的JavaScript框架,它简化了HTML文档的遍历、事件管理、动画效果以及Ajax通信。 在此项目中,jQuery将负责处理用户的点击动作(实现左右切换),并且制造流畅的过渡效果。 2. **图片轮播扩展工具**:开发者或许会采用现成的jQuery扩展,例如Slick、Bootstrap Carousel或个性化的轮播函数,以达成图片切换的功能。 这些扩展能够辅助迅速构建功能完善的轮播模块。 3. **即时数字呈现**:展示当前图片的序列号,这需要通过JavaScript或jQuery来追踪并调整。 每当图片切换时,相应的数字也会同步更新。 4. **CSS美化**:为了达成淘宝图片切换的视觉效果,可能需要设计特定的CSS样式,涵盖图片的排列方式、过渡效果、点状指示器等。 CSS3的动画和过渡特性(如`transition`和`animation`)在此过程中扮演关键角色。 5. **事件监测**:运用jQuery的`.on()`方法来监测用户的操作,比如点击左右控制按钮或自动按时间间隔切换。 根据用户的交互,触发相应的函数来执行...
垃圾实例分割数据集 一、基础信息 • 数据集名称:垃圾实例分割数据集 • 图片数量: 训练集:7,000张图片 验证集:426张图片 测试集:644张图片 • 训练集:7,000张图片 • 验证集:426张图片 • 测试集:644张图片 • 分类类别: 垃圾(Sampah) • 垃圾(Sampah) • 标注格式:YOLO格式,包含实例分割的多边形点坐标,适用于实例分割任务。 • 数据格式:图片文件 二、适用场景 • 智能垃圾检测系统开发:数据集支持实例分割任务,帮助构建能够自动识别和分割图像中垃圾区域的AI模型,适用于智能清洁机器人、自动垃圾桶等应用。 • 环境监控与管理:集成到监控系统中,用于实时检测公共区域的垃圾堆积,辅助环境清洁和治理决策。 • 计算机视觉研究:支持实例分割算法的研究和优化,特别是在垃圾识别领域,促进AI在环保方面的创新。 • 教育与实践:可用于高校或培训机构的AI课程,作为实例分割技术的实践数据集,帮助学生理解计算机视觉应用。 三、数据集优势 • 精确的实例分割标注:每个垃圾实例都使用详细的多边形点进行标注,确保分割边界准确,提升模型训练效果。 • 数据多样性:包含多种垃圾物品实例,覆盖不同场景,增强模型的泛化能力和鲁棒性。 • 格式兼容性强:YOLO标注格式易于与主流深度学习框架集成,如YOLO系列、PyTorch等,方便研究人员和开发者使用。 • 实际应用价值:直接针对现实世界的垃圾管理需求,为自动化环保解决方案提供可靠数据支持,具有重要的社会意义。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值