zoukankan      html  css  js  c++  java
  • 文件的上传和下载

    一、要实现文件上传,需在项目中添加两个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表示在下载时弹出对话框,提示用户保存或者直接打开文件,而后一部分表示下载文件的名称,两部分之间以“;”进行分隔

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

     

     

  • 相关阅读:
    velocity语法
    使用VS2003创建WEB程序的时候出现"AutoMation服务器不能创建对象"错误
    ASP.NET 2.0 Tips:跨页提交
    Tip #1 – 创建、管理、应用样式表的强大工具(Visual Studio 2008)
    解决ASP.NET2.0和1.1在同一台电脑上不能并行的问题
    Tip #2 - 样式应用工具(style application toolbar)
    利用HttpModuler实现WEB程序同一时间只让一个用户实例登陆
    ASP.NET Tips: 获取插入记录的ID
    通过rsync远程增量备份数据
    array_merge() [function.arraymerge]: Argument #1 is not an array in ……错误的解决办法
  • 原文地址:https://www.cnblogs.com/cn-chy-com/p/8449298.html
Copyright © 2011-2022 走看看