structs2之多文件上传

简介:

//首先是Action部分
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;

import javax.servlet.ServletContext;
import org.apache.struts2.ServletActionContext;

import com.hzml.dao.DistributeDao;
import com.opensymphony.xwork2.ActionSupport;

public class CompanyAndDistributeAction extends ActionSupport{
  //和form表单对应的name属性
    private DistributeDao distributeDao;
    private String developName;
    private String email;
    private String phone;
    private String timeID;
    private String money;
    private String taskDescribe;
    
  //多文件上传,form中的每个文件的name属性必须一样,在这里我的name="file"
    private List<File>    file; // 上传的文件
    private List<String> fileFileName; // 文件名称
    private List<String> fileContentType; // 文件类型
    private String savePath;
    
    public DistributeDao getDistributeDao() {
        return distributeDao;
    }

    public void setDistributeDao(DistributeDao distributeDao) {
        this.distributeDao = distributeDao;
    }

    public String getDevelopName() {
        return developName;
    }

    public void setDevelopName(String developName) {
        this.developName = developName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getTimeID() {
        return timeID;
    }

    public void setTimeID(String timeID) {
        this.timeID = timeID;
    }

    public String getMoney() {
        return money;
    }

    public void setMoney(String money) {
        this.money = money;
    }

    public String getTaskDescribe() {
        return taskDescribe;
    }

    public void setTaskDescribe(String taskDescribe) {
        this.taskDescribe = taskDescribe;
    }

    public List<File> getFile() {
        return file;
    }

    public void setFile(List<File> file) {
        this.file = file;
    }

    public List<String> getFileFileName() {
        return fileFileName;
    }

    public void setFileFileName(List<String> fileFileName) {
        this.fileFileName = fileFileName;
    }

    public List<String> getFileContentType() {
        return fileContentType;
    }

    public void setFileContentType(List<String> fileContentType) {
        this.fileContentType = fileContentType;
    }

    public String getSavePath() {
        return ServletActionContext.getServletContext().getRealPath(savePath);
    }

    public void setSavePath(String savePath) {
        this.savePath = savePath;
    }

    private void init() throws UnsupportedEncodingException{
        ServletActionContext.getRequest().setCharacterEncoding("UTF-8");
        ServletContext context = ServletActionContext.getServletContext();  
    }

    public String saveTask () throws Exception{
        init();
        // 取得需要上传的文件数组
        List<File> files = getFile();
        if (files != null && files.size() > 0) {
            for (int i = 0; i < files.size(); i++) {
                FileOutputStream fos = new FileOutputStream(getSavePath() + "\\" + getFileFileName().get(i));
                FileInputStream fis = new FileInputStream(files.get(i));
                byte[] buffer = new byte[1024];
                int len = 0;
                while ((len = fis.read(buffer)) > 0) {
                    fos.write(buffer, 0, len);
                }
                fis.close();
                fos.close();
            }
        }
        return "saveTask";
    }
    
    @Override
    public String execute() throws Exception{
         return "success";
    }
}


//jsp代码部分
<form action="companyAndDistributeAction" method="post" enctype="multipart/form-data" name="contactForm" id="contactForm">
                <br/>
                    <div>
                        <label>发布者:<span>*</span></label>
                        <input type="text" name="developName" id="developName"  />
                    </div>
                    <div>
                        <label>邮箱:<span>*</span></label>
                        <input type="text" name="email" id="email"  />
                    </div>
                    <div>
                        <label>电话:</label>
                        <input type="text" name="phone" id="phone"  />
                    </div>
                    <div>
                        <label>任务完成时间:<span>*</span></label>
                        <input type="text" name="timeID" id="timeID" />
                    </div>
                    <div>
                        <label>任务费用:<span>*</span></label>
                        <input type="text" name="money" id="money" />
                    </div>
                    <div>
                        <label>任务描述:</label>
                        <textarea name="taskDescribe" rows="10" cols="20" id="taskDescribe"></textarea>
                    </div>
                    <div>
                        <label>任务说明文档:<span>*</span></label>
                        <input type="file" name="file" id="file" />
                    </div>
                    <a class="button" href="#" style="float:right;" onclick="$('#contactForm')[0].submit(); return false;" id="send"><span>发布任务</span></a>
            </form>


//structs2配置文件部分
<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE struts PUBLIC     
  "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"     
  "http://struts.apache.org/dtds/struts-2.0.dtd">    
<struts>
  <!-- 将Action的创建交给spring来管理 -->  
  <constant name="struts.objectFactory" value="spring" />  
  <constant name="struts.i18n.encoding" value="utf-8"/>
  
  <package namespace="/" name="struts2" extends="struts-default">  
    
        <!-- package中的标签必须按照如下顺序配置
        result-types,interceptors,default-interceptor-ref,default-action-ref,default-class-ref,global-results,global-exception-mappings,action*(就是所有的action放到最后)
        -->
        <!-- 自定义拦截器 ,如果有拦截器,必须放在package标签内的第一位-->
        <interceptors>
              <!-- 在这里可以添加自己的拦截器
              <interceptor name="myInterceptor" class="自定义pojo类"></interceptor>
              -->
              <interceptor-stack name="myInterceptorStack">
                    <!--  
                    <interceptor-ref name="myInterceptor"></interceptor-ref>
                    -->
                    <interceptor-ref name="defaultStack"></interceptor-ref>
              </interceptor-stack>
        </interceptors>  
         
        <global-results>
              <result></result>
        </global-results>
        
        <action name="companyAndDistributeAction" class="companyAndDistributeAction" method="saveTask">
             <!-- 要创建/hzmlFile文件夹,否则会报找不到文件 -->
            <param name="savePath">/hzmlFile</param>
            <result name="saveTask">/ActionIntroduction.jsp</result> 
        </action>
        
        <!-- 访问主页 -->
        <action name="visitMainPage" class="login" method="visitMainPage">
             <result name="visitMainPage">/index.jsp</result> 
        </action>
        <!-- 用户登录 -->
        <action name="userLogin" class="login" method="userLogin">
             <result name="success">/ActionIntroduction.jsp</result> 
        </action>
  </package>
</struts>

目录
相关文章
|
XML JSON 缓存
深入理解RESTful API设计原则与实践
在现代软件开发中,构建高效、可扩展的应用程序接口(API)是至关重要的。本文旨在探讨RESTful API的核心设计理念,包括其基于HTTP协议的特性,以及如何在实际应用中遵循这些原则来优化API设计。我们将通过具体示例和最佳实践,展示如何创建易于理解、维护且性能优良的RESTful服务,从而提升前后端分离架构下的开发效率和用户体验。
|
Web App开发 JavaScript 前端开发
深入浅出Node.js:从零开始构建后端服务
【10月更文挑战第42天】在数字时代的浪潮中,掌握一门后端技术对于开发者来说至关重要。Node.js,作为一种基于Chrome V8引擎的JavaScript运行环境,允许开发者使用JavaScript编写服务器端代码,极大地拓宽了前端开发者的技能边界。本文将从Node.js的基础概念讲起,逐步引导读者理解其事件驱动、非阻塞I/O模型的核心原理,并指导如何在实战中应用这些知识构建高效、可扩展的后端服务。通过深入浅出的方式,我们将一起探索Node.js的魅力和潜力,解锁更多可能。
|
11月前
|
存储 数据可视化 知识图谱
高效知识管理的五大方法,助力写作更上一层楼
在信息爆炸的时代,高效的知识管理是提升写作效率与质量的关键。本文探讨如何通过系统化的知识获取、分类存储、动态更新和高效检索,构建个人知识体系,并介绍智能化工具如看板的应用,帮助写作者整合信息、激发灵感、优化流程,实现从输入到输出的闭环,持续提升创作能力。
262 14
高效知识管理的五大方法,助力写作更上一层楼
|
11月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的高校食堂移动预约点餐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
|
Linux
Linux Resin开机自动启动脚本写法
在Linux中,可以通过systemd服务来实现开机自动启动脚本。下面是一个编写开机自动启动脚本的示例:
537 0
|
编解码 搜索推荐 数据安全/隐私保护
创作高质量网页内容时,怎样使用图片和视频等多媒体元素?
在创作高质量网页内容时,合理使用图片、视频等多媒体元素能够显著增强内容的吸引力、可读性和分享性
|
数据管理 程序员 数据处理
利用Python自动化办公:从基础到实践####
本文深入探讨了如何运用Python脚本实现办公自动化,通过具体案例展示了从数据处理、文件管理到邮件发送等常见办公任务的自动化流程。旨在为非程序员提供一份简明扼要的实践指南,帮助他们理解并应用Python在提高工作效率方面的潜力。 ####
|
弹性计算 安全 网络协议
如何创建VPC并配置安全组以保护您的阿里云服务器
如何创建VPC并配置安全组以保护您的阿里云服务器
|
机器学习/深度学习 监控 安全
智能混凝土:自我修复与环境感应的建筑材料
【10月更文挑战第21天】智能混凝土是一种集自我修复与环境感应于一体的先进建筑材料。通过复合智能型组分,智能混凝土能够实现自感知、自适应和自修复,显著提高结构的耐久性和安全性,减少维修成本,促进环保节能。未来,智能混凝土将向多功能化、智能化和绿色化方向发展,为建筑行业带来革命性变革。
|
JavaScript 索引
jquery操作select(取值,设置选中)
jquery操作select(取值,设置选中)
432 0