Struts2.0实现的文件上传(单附件和多附件)以及附件下载功能

本文介绍如何使用Struts2框架实现文件的上传和下载功能,包括单文件和多文件上传的过程及代码实现,并展示了如何配置Struts2拦截器以支持文件上传。
     --------------------------------------------------单附件上传:----------------------------------------------------------------

 

Action类:

package com.yourcompany.struts.uponloadfile;
import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.util.Date;

 import org.apache.struts2.ServletActionContext;

 import com.opensymphony.xwork2.ActionSupport;

 public class FileUploadAction extends ActionSupport  {
     private static final long serialVersionUID = 572146812454l ;
     private static final int BUFFER_SIZE = 16 * 1024 ;
   
     private File myFile;
     private String contentType;
     private String fileName;
     private String imageFileName;
     private String caption;
   
     public void setMyFileContentType(String contentType)  {
         this .contentType = contentType;
    }
     //还有myFileContentType(上传文件的MIME类型)和myFileFileName(上传文件的文件名,该文件名不包括文件的路径)。因此,<s:file name="xxx" />
     //对应Action类里面的xxx、xxxContentType和xxxFileName三个属性。
     public void setMyFileFileName(String fileName)  {
         this .fileName = fileName;
    }
       
     public void setMyFile(File myFile)  {
         this .myFile = myFile;
    }
   
     public String getImageFileName()  {
         return imageFileName;
    }
   
     public String getCaption()  {
         return caption;
    }
 
      public void setCaption(String caption)  {
         this .caption = caption;
    }
   
     private static void copy(File src, File dst)  {
         try  {
            InputStream in = null ;
            OutputStream out = null ;
             try  {   
              //输入到缓冲流
                in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);
                out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);
                 byte [] buffer = new byte [BUFFER_SIZE];
                 while (in.read(buffer) > 0 )  {
                    out.write(buffer);
                }
             } finally  {
                 if ( null != in)  {
                    in.close();
                }
                  if ( null != out)  {
                    out.close();
                }
            }
         } catch (Exception e)  {
            e.printStackTrace();
        }
    }
   
     private static String getExtention(String fileName)  {
         int pos = fileName.lastIndexOf( "." );
         return fileName.substring(pos+1);//获得后缀名
    }
 
    @Override
     public String execute()      {       
        imageFileName = new Date().getTime() + getExtention(fileName);//合成图片的名称
        System.out.println("================="+imageFileName+"========="+ServletActionContext.getServletContext().getRealPath("WebRoot/UploadImages" ));
        File imageFile = new File(ServletActionContext.getServletContext().getRealPath( "/UploadImages") + "/" +imageFileName);
        copy(myFile, imageFile);
         return SUCCESS;
    }
}

 

struts.xml配置:

 

 

 

<action name ="fileUpload" class ="com.yourcompany.struts.uponloadfile.FileUploadAction" >
           
              <interceptor-ref name ="fileUpload" >
                <param name ="allowedTypes" >
                   image/bmp,image/png,image/gif,image/jpeg
                </param >
            </interceptor-ref > 
            <!-- <interceptor-ref name="timer"/>  用于测试action的执行时间 -->
         
            <interceptor-ref name ="defaultStack" />   
            <result name="input">/uploadfile_index.jsp</result >
            <result name="success">/uploadfile_result.jsp </result >
        </action >

 

 

 

 

uploadfile_index.jsp:

jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 
<%@ taglib uri="/struts-tags" prefix="s" %>


<%  
String path = request.getContextPath();  
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <base href="<%=basePath%>"> 
      
    <title>uploadfile_index.jsp</title> 
      
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="exires" content="0">      
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
    <meta http-equiv="description" content="This is my page"> 
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    --> 
 
  </head> 
    
  <body> 
    选择上传文件:类型是图片
  <s:fielderror />
    <s:form action ="fileUpload" method ="POST" enctype ="multipart/form-data" >
        <s:file name ="myFile"   label ="Image File" />
        <s:textfield name ="caption" label ="Caption" />       
        <s:submit />
    </s:form >
 
  </body> 
</html> 

 

uploadfile_result.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 
<%@ taglib uri="/struts-tags" prefix="s" %>


<%  
String path = request.getContextPath();  
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <base href="<%=basePath%>"> 
      
    <title>uploadfile_result.jsp</title> 
      
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="expires" content="0">      
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
    <meta http-equiv="description" content="This is my page"> 
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    --> 
 
  </head> 
    
  <body> 
  <div style ="padding: 3px; border: solid 1px #cccccc; text-align: center" >
        <img src ='UploadImages/<s:property value ="imageFileName" /> ' />
        <br />
        <s:property value ="caption" />
    </div >


  </body> 
</html> 

 

--------------------------------------------------多附件上传:----------------------------------------------------------------

 

Action类:

package com.yourcompany.struts.uponloadfile;
import java.io.BufferedInputStream;
 import java.io.BufferedOutputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
import java.util.ArrayList;
 import java.util.Date;
import java.util.List;

 import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

 public class maxFileUploadAction extends ActionSupport  {
     private static final long serialVersionUID = 572146812454l ;
     private static final int BUFFER_SIZE = 16 * 1024 ;
   
     private File[] uploads;
     private String[] uploadFileNames;
     private String[] uploadContentTypes;

     public File[] getUpload()  { return this .uploads; }
      public void setUpload(File[] uploads)  { this .uploads = uploads; }
 
      public String[] getUploadFileName()  { return this .uploadFileNames; }
      public void setUploadFileName(String[] uploadFileName)  { this .uploadFileNames = uploadFileName; }
 
      public String[] getUploadContentType()  { return this .uploadContentTypes; }
      public void setUploadContentType(String[] uploadContentType)  { this .uploadContentTypes = uploadContentType;
      }
     private static void copy(File src, File dst)  {
         try  {
            InputStream in = null ;
            OutputStream out = null ;
             try  {   
              //输入到缓冲流
                in = new BufferedInputStream( new FileInputStream(src), BUFFER_SIZE);
                out = new BufferedOutputStream( new FileOutputStream(dst), BUFFER_SIZE);
                 byte [] buffer = new byte [BUFFER_SIZE];
                 while (in.read(buffer) > 0 )  {
                    out.write(buffer);
                }
             } finally  {
                 if ( null != in)  {
                    in.close();
                }
                  if ( null != out)  {
                    out.close();
                }
            }
         } catch (Exception e)  {
            e.printStackTrace();
        }
    }
   
     private static String getExtention(String fileName)  {
         int pos = fileName.lastIndexOf( "." );
         return fileName.substring(pos+1);//获得后缀名
    }
 
    @Override
     public String execute(){    
     for(int i=0;i<3;i++){
       String imageFileName = new Date().getTime() +getExtention(uploadFileNames[i]);//合成图片的名称
        System.out.println("================="+imageFileName+"========="+ServletActionContext.getServletContext().getRealPath("WebRoot/UploadImages" ));
        File imageFile = new File(ServletActionContext.getServletContext().getRealPath( "/UploadImages") + "/" +imageFileName);
        copy(uploads[i], imageFile);
     }    
         return SUCCESS;
    }
}

 

 

 

struts.xml配置:

 

<action name ="maxfileUpload" class ="com.yourcompany.struts.uponloadfile.maxFileUploadAction" >
 <interceptor-ref name ="fileUpload" />
 <!--  <interceptor-ref name ="fileUploadStack" />  -->
  <interceptor-ref name ="defaultStack" />
 <result name="success">/uploadfile_maxresult.jsp </result >   
        </action >

 

jsp:

uploadfile_maxindex.jsp:

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 
<%@ taglib uri="/struts-tags" prefix="s" %>


<%  
String path = request.getContextPath();  
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <base href="<%=basePath%>"> 
      
    <title>uploadfile_maxindex.jsp</title> 
      
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="exires" content="0">      
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
    <meta http-equiv="description" content="This is my page"> 
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    --> 
 
  </head> 
    
  <body> 
  选择上传文件:不限类型
  <s:form action ="maxfileUpload" method ="POST" enctype ="multipart/form-data" >
    <s:file label ="File (1)" name ="upload" />
    <s:file label ="File (2)" name ="upload" />
    <s:file label ="File (3)" name ="upload" />
    <s:submit />
</s:form >
 
  </body> 
</html> 

 

 

uploadfile_maxresult.jsp

 

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> 
<%@ taglib uri="/struts-tags" prefix="s" %>


<%  
String path = request.getContextPath();  
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";  
%> 

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html> 
  <head> 
    <base href="<%=basePath%>"> 
      
    <title>uploadfile_maxresult.jsp</title> 
      
    <meta http-equiv="pragma" content="no-cache"> 
    <meta http-equiv="cache-control" content="no-cache"> 
    <meta http-equiv="exires" content="0">      
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 
    <meta http-equiv="description" content="This is my page"> 
    <!-- 
    <link rel="stylesheet" type="text/css" href="styles.css"> 
    --> 
 
  </head> 
    
  <body> 
 <h4>上传成功</h4>
 
  </body> 
</html> 

 

 

 

 

 

 

 

 

 

--------------------------------------------------附件下载:----------------------------------------------------------------

 

Action类:

 

package com.yourcompany.struts.filedown;

import java.io.InputStream;

import java.io.UnsupportedEncodingException;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.Action;

public class Filedown implements Action {

private String fileName;// 初始的通过param指定的文件名属性

private String inputPath;// 指定要被下载的文件路径


public InputStream getInputStream() throws Exception {

// 通过 ServletContext,也就是application 来读取数据

return ServletActionContext.getServletContext().getResourceAsStream(inputPath);

}

public String execute() throws Exception {

return SUCCESS;

}

public void setInputPath(String value) {

inputPath = value;

}

public void setFileName(String fileName) {

this.fileName = fileName;

}

/** 提供转换编码后的供下载用的文件名 */

public String getDownloadFileName() {

String downFileName = fileName;

try {

downFileName = new String(downFileName.getBytes(), "ISO8859-1");

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

}

return downFileName;

}

}

 

struts.xml配置:

 

 


<!-- 下载现有文件 -->
<action name="download3" class="com.yourcompany.struts.filedown.Filedown">
<param name="inputPath">/download/系统说明.doc</param>
<!-- 初始文件名 -->
<!-- 可以载页面传入 -->
<!-- <param name="fileName">系统说明.doc</param> -->
<result name="success" type="stream">
<param name="contentType">application/octet-stream;charset=ISO8859-1</param>
<param name="inputName">inputStream</param>
<!-- 使用经过转码的文件名作为下载文件名,downloadFileName属性
对应action类中的方法 getDownloadFileName() -->
<param name="contentDisposition">attachment;filename="${downloadFileName}"</param>
<param name="bufferSize">4096</param>
</result>
</action>

 

JSP:

 

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <title>filedown.jsp</title>
  
</head>
<body>   

<a href=" <s:url value="download3.action"> <s:param name="fileName">系统说明.doc</s:param> </s:url>">download</a>

</body>
</html>

已经博主授权,源码转载自 https://pan.quark.cn/s/a4b39357ea24 常见问题解答 网页打开速度慢或者打不开网页? 受到多种因素的影响,对于非会员用户我们无法提供最优质的服务。 如果您希望得到最棒的体验,请至大会员页面("右上角菜 → 大会员")根据说明操作。 请注意:受制于国际网络的诸多不确定性,我们无法对任何服务的可靠性做出任何保证。 如果出现了网络连接相关的问题,我们建议您先等待一段时间,之后再重试。 如果您在重试后发现问题仍然存在,请联系我们,并说明网络问题持续的时间。 图片下载后无法找到? 打开"右上角菜 → 更多 → 修改下载路径",在弹出的对话框中可以看到当前图片的保存路径。 此外,由于网络因素,在保存图片之后,等待屏幕下方出现"已保存到..."后,才能在本地找到图片。 如何更改图片保存的目录? 请参见"右上角菜 → 更多 → 修改下载路径"。 翻页不方便? 在点进某个图片后,通过在图片上向左或向右滑动,即可翻页查看下一个作品。 如何保存原图/导出动图? 长按图片/动图,在弹出的菜中选择保存/导出即可。 输入账号密码后出现"进行人机身份验证"? 此为pixiv登陆时的验证码,请按照要求点击方框或图片。 在pxvr中注册pixiv账号后,收到验证邮件,无法访问邮件中的验证链接? 请复制邮件中的链接,打开pxvr中的"右上角菜 → 输入地址"进行访问。 能否自动将页面内容翻译为汉语? 很抱歉,pxvr暂不提供语言翻译服务。 图片下载类型是否可以选择? 能否批量下载/批量管理下载? 已支持批量下载多图作品中的所有原图:找到一个多图作品,进入详情页面后,点击图片进入多图浏览模式,长按任意一张图片即可看到批量下载选项。 关于上述其他功能,我们...
考虑局部遮阴的光伏PSO-MPPT控制模型(Simulink仿真实现)内容概要:本文介绍了基于Simulink仿真实现的考虑局部遮阴的光伏PSO-MPPT控制模型,旨在通过粒子群优化(PSO)算法解决光伏发电系统在局部阴影条件下最大功率点跟踪(MPPT)的效率问题。文档不仅提供了该模型的技术实现方法,还列举了大量相关的MATLAB/Simulink仿真资源,涵盖电力系统、智能优化算法、机器学习、路径规划、信号处理等多个科研方向,适用于复现高水平期刊论文开展创新性研究。文中强调科研需逻辑缜密、善于借力,并提倡结合实际仿真与理论分析以提升研究深度。 适合人群:具备一定电力电子、自动控制或新能源背景,熟悉MATLAB/Simulink环境,从事光伏系统优化、智能算法应用或相关领域研究的研发人员及硕博研究生。 使用场景及目标:①研究局部遮阴下光伏系统MPPT控制策略的性能提升;②利用PSO等智能优化算法解决非线性、多峰值优化问题;③复现SCI/EI级别论文中的MPPT控制模型;④开展光伏系统建模与仿真教学或项目开发。 阅读建议:建议读者结合文档提供的网盘资源,下载完整代码与模型文件,按照目录顺序逐步学习,重点理解PSO算法在MPPT中的应用机制,并通过修改参数、对比实验等方式深入掌握仿真细节,提升工程实践与科研创新能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值