struts2实现文件上传(多文件上传)及下载

一、要实现文件上传,需在项目中添加两个jar文件

二、上传准备的页面

注:必须植入enctype="multipart/form-data"属性,以及提交方式要设置成post

复制代码
 <h2>单个文件上传</h2>
    <s:form action="upload.action" enctype="multipart/form-data" method="post">
    <s:textfield name="title" label="标题"/>
    <s:file name="upload" label="选择文件"/><br/>
    <s:submit name="submit" value="上传文件"></s:submit>
    
    </s:form>
复制代码

实现文件上传的Action类

复制代码
public class UploadAction extends ActionSupport{
    //封装上传文件属性
    private File upload;
    //封装上传文件的类型
    private String uploadContentType;
    //封装上传文件名称
    private String uploadFileName;
    //获取文件上传的路径
    private String savePath;
    
    @Override
    public String execute() throws Exception {
        byte[] buffer=new byte[1024];
        
        //读取文件
        FileInputStream fis=new FileInputStream(getUpload());
        //保存文件
        FileOutputStream fos=new FileOutputStream(getSavePath()+"\\"+this.getUploadFileName());
        int length=fis.read(buffer);
        while(length>0){
            //每次写入length长度的内容
            fos.write(buffer,0,length);
            length=fis.read(buffer);
        }
        fis.close();
        fos.flush();
        fos.close();
        
        return SUCCESS;
    }

      //获取文件上传的保存路径 通过读取存放目录获得保存路径
       public String getSavePath() {
          return ServletActionContext.getServletContext().getRealPath(savePath);
     }

 
复制代码

在Action中使用了三个属性封装文件信息:

File类型的XXX属性,与表单的File控件的name属性一样,用于封装File控件对应的文件内容

String类型的xxxFileName属性,该属性名称由前面的File类型属性和FileName组合,是固定的语法,是封装File控件对应文件的文件名

String类型的XXXContentType属性,同样由xxx属性和ContentType组合而成,是固定语法,封装File控件对应文件的文件类型

配置Action:

复制代码
<?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>
   <constant name="struts.devMode" value="true"></constant>
    <package name="default" namespace="/" extends="struts-default">
    <!-- 文件上传 -->
        <action name="upload" class="cn.happy.action.UploadAction">
        <!-- 通过param参数设置保存目录的路径 -->
        <param name="savePath">/upload</param>
           <result name="success">ok.jsp</result> 
        </action>
        
    </package>
</struts>
复制代码

上传成功后的结果页面:植入的value是Action类中所对应的实体类属性

 您所上传的文件是:<s:property value="uploadFileName"/><br/>
 文件类型:<s:property value="uploadContentType"/>

实现效果:


三、多文件上传

与单文件上传的不同之处在于 将三个属性的类型修改成数组类型,并通过for循环进行遍历

复制代码
public class SomeUploadAction extends ActionSupport {

    // 封装上传文件属性
    private File[] upload;

    // 封装上传文件的类型
    private String[] uploadContentType;

    // 封装上传文件名称
    private String[] uploadFileName;

    // 封装文件上传的路径
    private String savePath;

    public String execute() throws Exception {
        byte[] buffer = new byte[1024];
        for (int i = 0; i < upload.length; i++) {
            FileInputStream fis = new FileInputStream(getUpload()[i]);
            FileOutputStream fos = new FileOutputStream(getSavePath() + "\\"
                    + this.getUploadFileName()[i]);
            int length = fis.read(buffer);
            while (length > 0) {
                fos.write(buffer, 0, length);
                length = fis.read(buffer);
            }
            fos.flush();
            fos.close();
            fis.close();
        }
        return SUCCESS;
    }

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

 
复制代码

实现效果:


 

 四、实现文件下载

为了支持文件的下载,Struts2框架提供了stream结果类型,该类型的作用就是专门用于实现文件下载的功能

 

实现文件下载:

 由于在Struts2中实现文件下载时需要用到InputStream,所以在文件下载Action中要提供一个获得InputStream的方法,通过这个输入流将可以获取希望下载的文件内容

复制代码
public class DownAction extends ActionSupport{

    //读取下载文件的目录
    private String inputPath;
    //下载文件的文件名
    private String fileName;
    //读取下载文件的输入流
    private InputStream inputStream;
    //下载文件的类型
    private String conetntType;
    
    @Override
    public String execute() throws Exception {
        
        return SUCCESS;
    }
        //创建InputStream输入流
    public InputStream getInputStream() throws FileNotFoundException {
        String path=ServletActionContext.getServletContext().getRealPath(inputPath);
        return new BufferedInputStream(new FileInputStream(path+"\\"+fileName));
    }
复制代码

通过Context上下文得到下载文件的实际路径,并构建了一个InputStream输入流实现文件下载读取

Action配置:

复制代码
<?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>
   <constant name="struts.devMode" value="true"></constant>
    <package name="default" namespace="/" extends="struts-default">
   
        <!-- 文件下载 -->
        
         <action name="down" class="cn.happy.action.DownAction">
        <param name="inputPath">/image</param>
           <result name="success" type="stream">
           <param name="contentType">application/octet-stream</param>
           <param name="inputName">inputStream</param>
           <param name="contentDisposition">attachment;filename="${fileName}"</param>
           <param name="bufferSize">4096</param>
           </result> 
        </action>
    </package>
</struts>
复制代码

在配置文件中,contentType参数决定了下载文件的类型。不同文件类型对应的参数值也是不同的。

通常情况下,contentType参数直接设置为application/octet-stream即可

contentDispoistion参数由两个部分组成,前面的部分表示处理文件的形式,如attachement表示在下载时弹出对话框,提示用户保存或者直接打开文件,而后一部分表示下载文件的名称,两部分之间以“;”进行分隔

当单击超链接时,即可下载

 

posted @ 2016-10-14 13:46  吴松~  阅读(137)  评论(0编辑  收藏  举报