struts2框架单文件、多文件上传实例详解

版权声明:本文为博主原创文章,如需转载,请标明出处。 https://blog.csdn.net/alan_liuyue/article/details/79390681

简介

  1.上一篇博客讲解了JFinal框架单文件、多文件上传代码,那么本篇博客将会介绍struts2框架单文件、多文件上传;
  2.struts2框架本身就已经封装了文件获取和解析的特有的方法,所以,我们之需要将这些方法熟练运用展示出即可;
  3.本篇实例将会分成四个步骤,给您展示一步到位的完善的struts2框架文件上传:
  (1).需要的jar包;
  (2).jsp页面;
  (3).xml配置;
  (4).后台controller处理方法;

实例

  1.需要提供的jar包:commons.fileupload-1.2.1.jar; commons.io-1.4.0.jar
  
  2.jsp页面:

     <!-- enctype 默认是 application/x-www-form-urlencoded -->  
     <form action="address_upload" enctype="multipart/form-data" method="post" >  

               地址:<input type="text" name="addressName"> <br/>  
               上传文件:<input type="file" name="address"><br/>  

              <input type="submit" value="提交"/>  

     </form> 

<!--注意:要在form标签中加上enctype="multipart/form-data"表示该表单是要处理文件的,

这是最基本的东西,很多人会忘记然而当上传出错后则去找程序的错误,却忘了这一点 -->

  3.xml文件配置:


<!--说明:
*   Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,
*   <interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
-->
<struts>
    <!--解决乱码 -->
    <constant name="struts.i18n.encoding" value="UTF-8" />

    <!-- 指定允许上传的文件最大字节数。默认值是2097152(2M) -->
    <constant name="struts.multipart.maxSize" value="2147483648" />

    <!-- 设置上传文件的临时文件夹,默认使用javax.servlet.context.tempdir -->
    <constant name="struts.multipart.saveDir " value="d:/tmp" />

    <!--action内部配置:-->
    <action name="address_*" class="articleAction" method="{1}">
        <interceptor-ref name="fileUpload">
            <!-- 文件过滤,不写则不会对文件进行过滤 -->
            <param name="allowedTypes">image/bmp, image/x-png,image/png, image/gif, image/jpeg</param>

            <!-- 文件大小, 以字节为单位,必须小于全局的struts.multipart.maxSize大小配置 -->
            <param name="maximumSize">1073741824</param>

        </interceptor-ref>

        <!-- 默认拦截器必须放在fileUpload之后,否则无效 -->
        <interceptor-ref name="defaultStack" /> 
    </action>
</struts>

   4.后台controller处理方法类:

一、struts2单文件上传

    1、创建set和get方法,用于自动匹配前台数据:
    @Controller
    public class AddressAction extends ActionSupport{   

        //具体上传文件的引用, 指向临时目录中的临时文件
        private File address;   

        // 上传文件的名字 ,在file名称address后面添加FileName,固定的写法
        private String addressFileName;     

        // 上传文件的类型,在file名称address后面添加ContentType,固定的写法
        private String addressContentType;      

        public File getAddress() {
            return address;
        }

        public void setAddress(File address) {
            this.address = address;
        }

        public String getAddressFileName() {
            return addressFileName;
        }

        public void setAddressFileName(String addressFileName) {
            this.addressFileName = addressFileName;
        }

        public String getAddressContentType() {
            return addressContentType;
        }

        public void setAddressContentType(String addressContentType) {
            this.addressContentType = addressContentType;
        }

    }

    2、创建处理文件的action
    /** 
     * 上传文件其实是上传了两份, 
     *  
     * 首先将上传的文件保存到 default.properties 文件中 struts.multipart.saveDir键指定的目录中 
     * 默认是空的 
     * 保存在  Tomcat 6.0\work\Catalina\localhost\struts2目录下以.tmp后缀名的文件 
     *  
     * 如果要在 struts.multipart.saveDir 指定目录, 则可以在 src文件夹下 建一个 struts.properties, 
     * 覆盖  default.properties 的某些键值 
     *  
     * 还有一份是 存放在自己设定的目录下 
     */
    public String upload(){

       //测试获取到的文件信息
       System.out.println("文件名称:"+addressFileName);  
       System.out.println("文件类型:"+addressContentType);          

       //获取项目保存文件的根目录
       String savePath = ServletActionContext.getServletContext().getRealPath("/uploadFile/placeImage");    

       //根据原文件名使用时间戳和随机数重命名,保存
       SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");     
       String lastThreeLetter = addressFileName.substring(addressFileName.lastIndexOf("."));
       String sqlName = sdf.format(new Date())+(int)(Math.random()*10000)+lastThreeLetter;  

       //根据根目录和文件名,创建新的文件路径  
       File saveFile = new File(savePath+File.separator+sqlName); //new File(savePath,sqlName);

       //编写输入流方法,读取文件
       InputStream is=new FileInputStream(getAddress());  //读取文件

       //编写输出流方法,保存文件
       OutputStream os=new FileOutputStream(saveFile);  
       byte buffer[]=new byte[1024];  
       int length=0;  
       while((length=is.read(buffer))>0){  
           os.write(buffer, 0, length);  
       }  
       os.close();
       is.close();         

       //返回json数据,这里由于有文件传输,所以需要返回html格式,在前台使用JSON.parse(data)转换成json
       response.setContentType("text/html");
       String data="{\"result\":\"success\"}";
       response.getWriter().print(data);

       return null;

    }



二、struts2多文件上传:

    1、创建set和get方法,用于自动匹配前台数据:
    /**
    * 因为是多文件,所以需要使用list集合接收,然后进行遍历解析
    */
    @Controller
    public class AddressAction extends ActionSupport{

        //具体上传文件的引用, 需和前台的name属性一致, 指向临时目录中的临时文件
        private List<File> address;     

        // 上传文件的名字 ,在file名称address后面添加FileName,固定的写法
        private List<String> addressFileName;

        // 上传文件的类型,在file名称address后面添加ContentType,固定的写法      
        private List<String> addressContentType;    

        public List<File> getAddress() {
            return address;
        }

        public void setAddress(List<File> address) {
            this.address = address;
        }

        public List<String> getAddressFileName() {
            return addressFileName;
        }

        public void setAddressFileName(List<String> addressFileName) {
            this.addressFileName = addressFileName;
        }

        public List<String> getAddressContentType() {
            return addressContentType;
        }

        public void setAddressContentType(List<String> addressContentType) {
            this.addressContentType = addressContentType;
        }       

    }

    2.创建处理多文件的action
    /**
    * 获取和保存的方式和单文件差不多,只是多文件多了一个遍历的功能
    * 文件的重命名功能可以封装成一个工具类
    */
    public String upload(){

        //获取项目保存文件的根目录
        String savePath = ServletActionContext.getServletContext().getRealPath("/uploadFile/placeImage");   

        //格式化时间戳命名
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
        String timePath = sdf.format(new Date());

        //循环读取文件,同时写入文件
        for(int i = 0 ; i < address.size() ; i++ )  
        {  
            //获取文件,添加时间戳和随机数对文件重命名
             String lastThreeLetter = addressFileName.get(i).substring(addressFileName.lastIndexOf("."));
             String sqlName = timePath + (int)(Math.random()*10000)+lastThreeLetter;

            //根据根目录和文件名,创建新的文件路径  
            File saveFile = new File(savePath+File.separator+sqlName); //new File(savePath,sqlName);

            //编写输入流方法,读取文件          
            InputStream is = new FileInputStream(address.get(i));   

            //OutputStream os = new FileOutputStream(new File(path,addressFileName.get(i))); //直接使用原文件的文件名保存            

            //编写输出流方法,保存文件
            OutputStream os=new FileOutputStream(saveFile);  
            byte buffer[]=new byte[1024];  
            int length=0;  
            while((length=is.read(buffer))>0){  
                os.write(buffer, 0, length);  
            }  
            os.close();
            is.close();       
        }

       //返回json数据,这里由于有文件传输,所以需要返回html格式,在前台使用JSON.parse(data)转换成json
       response.setContentType("text/html");
       String data="{\"result\":\"success\"}";
       response.getWriter().print(data);

       return null;             
    }

总结

  1.以上就是struts2框架单文件、多文件上传的全部流程,代码也是简洁方便,对于还不是很了解struts2上传文件的程序猿还是有帮助的,有需要的可以自行复制代码,然后可以经过自己的进一步加工,形成对自己最有效的一套代码;
  
  2.实践是检验认识真理的唯一标准,代码好不好用,何不亲自动手实践看看;

上一篇:Akka源码分析-Actor发消息


下一篇:【转载】作为一个运维,我怎么看Docker?