Struts2批量上传文件

Struts2文件上传

struts.xml

  <!-- 文件上传的拦截器栈 -->
       <interceptors>
        <interceptor-stack name="fileUploadStack">
   <interceptor-ref name="fileUpload">
       <param name="maximumSize">409600</param>
    <param name="allowedTypes">image/pjpeg,image/bmp,image/jpg,image/png,image/gif,image/jpeg</param>
   </interceptor-ref>
   <interceptor-ref name="basicStack"/>
  </interceptor-stack>
      </interceptors>
     
       <default-interceptor-ref name="fileUploadStack"></default-interceptor-ref>
       <action name="upload" class="com.gdf.struts2.action.UploadAction">
   <result name="success">/test/uploadResult.jsp</result>
   <result name="input">/test/upload.jsp</result>
    <interceptor-ref name="fileUploadStack"></interceptor-ref>
  </action>

 

UploadAction.java

 

package com.gdf.struts2.action;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.gdf.util.Upload;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;


public class UploadAction extends ActionSupport
{
 private String username;

 private String password;

 private List<File> file;

 private List<String> fileFileName;

 private List<String> fileContentType;
 

 public String getUsername()
 {
  return username;
 }

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

 public String getPassword()
 {
  return password;
 }

 public void setPassword(String password)
 {
  this.password = password;
 }

 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;
 }

 @Override
 public String execute() throws Exception
 {
  
  Upload upload=new Upload();
  //ActionContext ctx = ActionContext.getContext();
  //HttpServletRequest request = (HttpServletRequest) ctx.get(ServletActionContext.HTTP_REQUEST);
  //System.out.println(com.gdf.util.SessionManager.getUser(request).getId());
  ArrayList list=upload.upload(file, this.getFileFileName(),"/files/");
  if (list.size()>0){
   return INPUT;
  }else{
    return SUCCESS;
  }
 }

}

 

 

Upload.java

 

 

package com.gdf.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.struts2.ServletActionContext;

public class Upload {
  @SuppressWarnings("unchecked")
  /**
   * @file:文件域列表
   * @fileName:上传文件的文件名
   * @path:文件上传的目录,相对目录。
   * 说明:文件上传所存放目录的规则:网站根目录下 files/会员ID/网站类型名称/上传文件分类名称/
   * @返回结果:一个存放上传文件所在位置相对路径的ArrayList
   * */
  public ArrayList upload(List file,List fileName,String path) throws IOException{
   String root = ServletActionContext.getRequest().getRealPath(path);
   File dir=new File(root);
   if (dir.exists()==false){
    dir.mkdirs();
   }
   ArrayList list=new ArrayList();
   for (int i = 0; i < file.size(); ++i)
  {
   InputStream is = new FileInputStream(file.get(i).toString());  
   SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss");//格式化时间输出
   String Rname=sdf.format(new Date());//取得当前时间,Date()是java.util包里的,这作为真实名称
   String name=fileName.get(i).toString();//得到上传文件的原名称
   name=Rname+name;//重命名文件名称,命名规则为:时间+原文件名称
   File destFile = new File(root, name);

   OutputStream os = new FileOutputStream(destFile);

   byte[] buffer = new byte[400];

   int length = 0;

   while ((length = is.read(buffer)) > 0)
   {
    os.write(buffer, 0, length);
   }
   list.add(path+name);
   is.close();

   os.close();
  }
   return list;
  }
}

 


upload.jsp

 

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
   
<%@ taglib prefix="s" uri="/struts-tags" %>
   
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Struts2批量上传文件</title>
<script src="/js/check_upload_file.js"></script>
<script src="/js/validate.js"></script>
<script type="text/javascript">

function addMore()
{
 var td = document.getElementById("more");
 var br = document.createElement("br");
 var input = document.createElement("input");
 var button = document.createElement("input");
 var span=document.createElement("span");
 input.type = "file";
 input.name = "file";
 button.type = "button";
 button.value = "Remove";
 
 button.onclick = function()
 {
  td.removeChild(br);
  td.removeChild(input);
  td.removeChild(button);
  td.removeChild(span);
 }
 input.onchange=function(){
   clearTooltip(this);
   checkExt(this);
 }
 td.appendChild(br);
 td.appendChild(input);
 td.appendChild(span);
 td.appendChild(button);
 
}

</script>

</head>

<body>

 <table align="center" width="50%">
   <tr>
    <td>

     <s:fielderror cssStyle="color:red" />

    </td>
   </tr>
  </table>


  <s:form action="upload" theme="simple" enctype="multipart/form-data">

   <table align="center" width="50%" border="1">
    <tr>
     <td>
      用户名:
     </td>
     <td>
      <s:textfield name="username"></s:textfield>
     </td>
    </tr>

    <tr>
     <td>
      密码:
     </td>
     <td>
      <s:password name="password"></s:password>
     </td>
    </tr>


    <tr>
     <td>
      file
     </td>

     <td id="more">
      <s:file name="file" onchange="clearTooltip(this);checkExt(this);" ></s:file><span></span>
      <input type="button" value="Add More.." onclick="addMore()">
     </td>
    </tr>
    
    <tr>
     <td>
      <s:submit value=" submit "></s:submit>
     </td>

     <td>
      <s:reset value=" reset "></s:reset>
     </td>
    </tr>
   </table>

  </s:form>
</body>

</html>

运行本例子之前,请自行搭建好Struts2的运行环境,例子中所用到的的js文件就不贴出来了,提供下载。

本指南详细阐述基于Python编程语言结合OpenCV计算机视觉库构建实时眼部状态分析系统的技术流程。该系统能够准确识别眼部区域,并对眨眼动作与持续闭眼状态进行判别。OpenCV作为功能强大的图像处理工具库,配合Python简洁的语法特性与丰富的第三方模块支持,为开发此类视觉应用提供了理想环境。 在环境配置阶段,除基础Python运行环境外,还需安装OpenCV核心模块与dlib机器学习库。dlib库内置的HOG(方向梯度直方图)特征检测算法在面部特征定位方面表现卓越。 技术实现包含以下关键环节: - 面部区域检测:采用预训练的Haar级联分类器或HOG特征检测器完成初始人脸定位,为后续眼部分析建立基础坐标系 - 眼部精确定位:基于已识别的人脸区域,运用dlib提供的面部特征点预测模型准确标定双眼位置坐标 - 眼睑轮廓分析:通过OpenCV的轮廓提取算法精确勾勒眼睑边缘形态,为状态判别提供几何特征依据 - 眨眼动作识别:通过连续帧序列分析眼睑开合度变化,建立动态阈值模型判断瞬时闭合动作 - 持续闭眼检测:设定更严格的状态持续时间与闭合程度双重标准,准确识别长时间闭眼行为 - 实时处理架构:构建视频流处理管线,通过帧捕获、特征分析、状态判断的循环流程实现实时监控 完整的技术文档应包含模块化代码实现、依赖库安装指引、参数调优指南及常见问题解决方案。示例代码需具备完整的错误处理机制与性能优化建议,涵盖图像预处理、光照补偿等实际应用中的关键技术点。 掌握该技术体系不仅有助于深入理解计算机视觉原理,更为疲劳驾驶预警、医疗监护等实际应用场景提供了可靠的技术基础。后续优化方向可包括多模态特征融合、深度学习模型集成等进阶研究领域。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值