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组织提供的上传下载开源项目理解。

  • 相关阅读:
    ubuntu远程windows桌面
    spring boot 给返回值加状态 BaseData
    spring boot 拦截异常 统一处理
    IntelliJ IDEA spring boot 远程Ddbug调试
    IntelliJ IDEA 常用插件
    spring boot 请求地址带有.json 兼容处理
    spring boot 接口返回值去掉为null的字段
    spring boot 集成disconf
    Spring boot 自定义拦截器
    Linux下安装MySQL
  • 原文地址:https://www.cnblogs.com/crazylqy/p/4432069.html
Copyright © 2011-2022 走看看