zoukankan      html  css  js  c++  java
  • struts2.1.6教程九、文件上传下载(了解)

    首先建立struts2UpDownLoad项目,搭建好struts2基本的开发环境。

    1. 上传实例

    步骤一:upload.jsp代码如下:

    <s:form action="upload" method="post" enctype="multipart/form-data">
            <s:file name="file" label="上传的头像(格式:jpg,gif,bmp)"></s:file>
            <s:submit value="上传"/>        <s:reset value="取消"/>
        </s:form>

    注意:在form标签中我们用到了enctype实体,这是上传时必须用到得。
    步骤二,建立struts.xml。对upload.action的配置如下:

    <action name="upload" class="com.asm.UploadAction">
                <param name="savePath">img</param>
                <result>/upSuc.jsp</result>
                <result name="input">upload.jsp</result>
                <interceptor-ref name="defaultStack">
                    <param name="fileUpload.maximumSize">1024*1024</param>
    <param name="fileUpload.allowedTypes">
    image/bmp,image/pjpeg,image/gif
    </param>
                </interceptor-ref>
    </action>    

    在这里唯一需要说明的是<interceptor-ref>下的参数问题,在以前如果要为某个特定的拦截器传递参数需要在<interceptor>下配置pararm参数,在此处我们用.形式来配置fileUpload拦截器的参数。这用做即可以保证默认的拦截器栈起作用,也可以向fileUpload拦截器传递参数。第一个参数是限制上传图片的大小(除了可以这样限制图片大小,也可以配置一个常量的方法来限制上传文件的大小,配置的内容为:<constant name="struts.multipart.maxSize" value="文件大小"/>),第二个参数是限制上传图片的格式只能为bmp,pjpeg,gif关于这些参数可以参看fileupload拦截器对应类的api文档。

    另还需注意:在action下的“<param name="savePath">img</param>”代码可以为UploadAction的savePath字段传递值,这样作的好处是在项目正式发布后,我们可以通过修改struts.xml中的配置来灵活给savePath赋值。而如果直接在java源代码中初始化savePath的值,在项目运行后就不能简单修改。这种用法主要是为了给客户提供一个灵活可配的特定初始化方式。


    步骤三、编写UploadAction,主要代码如下:

    package com.asm;
    public class UploadAction extends ActionSupport {
        private String savePath;
        private File file;
        private String fileFileName;
        private String fileContentType;
    
        public String execute() throws Exception {
            String path=ServletActionContext.getServletContext().getRealPath(savePath);
            String savaFileName=path+"\"+fileFileName;
            //System.out.println(savaFileName); 
            
            BufferedInputStream bis=null;
            BufferedOutputStream bos=null;
            try{
            bis=new BufferedInputStream(new FileInputStream(file));
            bos=new BufferedOutputStream(new FileOutputStream(savaFileName));
            
            byte []buf=new byte[(int) file.length()];
            int len=0;
            while((len=bis.read(buf))!=-1){
                bos.write(buf,0,len);
            }}catch(Exception e){
                e.printStackTrace();
            }finally{
                if(bis!=null)
                    bis.close();
                if(bos!=null)
                    bos.close();
            }
            return SUCCESS;
        }
        ...省略以上四个字段的get/set方法
    }

    说明:其实上传的难点就是在此action的处理上。首先是从配置文件中读取文件的保存路径,然后联合fileFileName(命名规则是上传的文件对应的字段名+FileName,如果要得到上传文件的类型,固定的写法应是上传的文件对应的字段名+ContentType,比如这里应为fileContentType)来确定完整的保存路径,并最终为创建BufferedOutputStream作准备。BufferedInputStream是通过前台upload.jsp页面传递的file构建。特别要注意处理流,如果书写不当可能会使上传文件循环写入,使得硬盘容量不够。还要注意对流的关闭问题。 补充:关于文件的操作可以使用commons-io.jar包的FileUtils类下的copyFile方法来进行文件的拷贝,比如这里调用copyFile方法(file,要保存的目录)

    上传成功后,upSuc.jsp的主要内容如下:

    <body>
    <h4>上传成功,以下是你刚上传的图片:</h4>
    <img src="<%=request.getContextPath() %>/<s:property value="savePath+'/'+fileFileName"/>">    <br>
        保存路径为:<s:property value="savePath+'/'+fileFileName"/>
     </body>

    说明:当上传成功后,会显示上传的图片。

    扩展实例:如果想上传多个文件,可以在Action中使用File[] files来接受上传的文件(jsp中对应的上传文件的参数均应为files)。对应的上传文件的名字,使用String[] fileFileName。然后循环files数组保存File文件对象。

    2.下载实例

    下载页面的doload.jsp的主要代码如下:

    <a href="download.action?downloadName=img/a.bmp">下载图片</a><br>
    <a href="download.action?downloadName=img/music.rar">下载千千静听</a><br>

    对应的download action配置如下:

    <action name="download" class="com.asm.DownloadAction">
                <result name="success" type="stream">
    <param name="inputName">targetFile</param>
                <param name="contentType">
                  image/bmp,application/x-zip-compressed
                </param>                
                </result>
            </action>

    说明:type类型指明了结果集为流类型,并且为流类型结果集配置了参数,inputName指定流的来源,这里来源为targetFile,所以在下面的Action中有getTargetFile方法, contentType指明下载时的文件类型。

    DownloadAction的主要代码如下:

    package com.asm;
    public class DownloadAction extends ActionSupport {
        private String downloadName;
        public String execute() throws Exception {
            return SUCCESS;
        }
    
    public InputStream getTargetFile(){
        return ServletActionContext.getServletContext().getResourceAsStream(downloadName);
        }
    
        public void setDownloadName(String downloadName) {
            this.downloadName = downloadName;
        }
    }

    说明:下载实例在此略作了解,具体可以借助apache组织提供的上传下载开源项目理解。

  • 相关阅读:
    java内存分析 栈 堆 常量池的区别
    了解struts2 action的一些原理
    条件语句的写法
    Library中的title与Name
    样式优先级、margin
    文件夹IsShow字段为空
    Ispostback
    HierarchicalDataBoundControl 错误
    DBNull与Null
    sharepoint中的YesNo字段
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4432069.html
Copyright © 2011-2022 走看看