zoukankan      html  css  js  c++  java
  • struts2文件上传

    上传原理:

    回顾:

    之前不使用框架,导入commons-fileupload.jar和commons-io.jar

    首先进行解析,将request对应参数转为File对象:

    使用factory:

    request.setCharacterEncoding("UTF-8"); 
    
    DiskFileItemFactory factory = new DiskFileItemFactory(); 
    
    //设置上传工厂的限制 
    
    factory.setSizeThreshold(1024 * 1024 * 20); 
    
    factory.setRepository(new File(request.getRealPath("/"))); 
    
    //创建一个上传文件的ServletFileUpload对象 
    
    ServletFileUpload upload = new ServletFileUpload(factory); 
    
    //设置最大的上传限制 
    
    upload.setSizeMax(1024 * 1024 * 20); 
    
    //处理HTTP请求,items是所有的表单项 
    
    List items = upload.parseRequest(request); 
    
    //遍历所有的表单项 
    
    for(Iterator it = items.iterator();it.hasNext();){ 
    
    FileItem item = (FileItem) it.next(); 
    
    if(item.isFormField()){ 
    
    String name = item.getFieldName(); 
    
    String value = item.getString("GBK"); 
    
    out.println("表单域的name=value对为:" + name + "=" + value); 
    
    }else{ 
        .......
    } 
    
    } 

    不使用factory:

    DiskFileUpload diskFileUpload = new DiskFileUpload();
            try{
                List<FileItem> list = diskFileUpload.parseRequest(request);
                
                out.println("遍历所有的FileItem...<br/>");
                for(FileItem fileItem : list){
                    if(fileItem.isFormField()){
                        if("description1".equals(fileItem.getFieldName())){
                            out.println("遍历到description1 ... <br/>");
                            description1 = new String(fileItem.getString().getBytes(),"UTF-8");
                        }
                        if("description2".equals(fileItem.getFieldName())){
                            out.println("遍历到description2 ... <br/>");
                            description2 = new String(fileItem.getString().getBytes(),"UTF-8");
                        }
                    }else{
    ......
    }
    }
    }catch(Exception e){
    ......
    }

    然后,获取对应参数构建InputStream和OutputStream,进行IO读写操作

    //取得文件域的表单域名 
    
    String fieldName = item.getFieldName(); 
    
    //取得文件名 
    
    String fileName = item.getName(); 
    
    //取得文件类型 
    
    String contentType = item.getContentType(); 
    
    out.println("表单域的name=value对为:" + fieldName + "=" + fileName); 
    
    //以原文件名作为新的文件名 
    
    FileOutputStream fos = new FileOutputStream(request.getRealPath("/") + fileName); 
    
    //如果上传文件域对应文件的内容已经在内存中 
    
    if(item.isInMemory()){ 
    
    fos.write(item.get()); 
    
    }else{ 
    
    //获取上传文件内容的输入流 
    
    InputStream is = item.getInputStream(); 
    
    byte[] buffer = new byte[1024]; 
    
    int len; 
    
    //读取上传文件的内容,并将其写入服务器的文件中 
    
    while((len = is.read(buffer)) > 0){ 
    
    fos.write(buffer,0,len); 
    
    } 
    
    //关闭输入流和输出流 
    
    is.close(); 
    
    fos.close(); 
    
    } 

    struts2的文件上传与之前的文件上传有什么区别呢?

    其实原理都是一样的。不过是struts2将前面解析file控件传递过来的内容解析自动解析成了对应的对象,并且自动赋值给了action内的对应对象。

        >该解析操作封装在一个默认的拦截器中。fileUpload拦截器

          <interceptor-ref name="fileUpload"/>

           该拦截器有三个参数:

           maxmumSize :最大上传字节,默认为2M

           allowedTypes:允许上传的类型,用逗号分隔,例如:text/html

           allowedExtensions:允许上传文件的后缀名,用逗号分隔,例如:.html

       >自动赋值给action中对应属性,两个要求:

        调用默认拦截器组:<interceptor-ref name="defaultStack" />

        jsp和action中的属性名要一致,举个例子说明吧:

    jsp中: 
    <s:file name="upload" label="File"/>
    action中属性:
    private File upload;
    private String uploadFileName;
    private String uploadContentType;
    对应getter和setter方法

    单个文件上传:

    package com.upload;
    
    import java.io.*;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    
    
    public class UploadAction extends ActionSupport{
        private File file;
        private String fileFileName;
        private String filecontentType;
        public File getFile() {
            return file;
        }
        public void setFile(File file) {
            this.file = file;
        }
        public String getFileFileName() {
            return fileFileName;
        }
        public void setFileFileName(String fileFileName) {
            this.fileFileName = fileFileName;
        }
        public String getFilecontentType() {
            return filecontentType;
        }
        public void setFilecontentType(String filecontentType) {
            this.filecontentType = filecontentType;
        }
        
        public String execute(){
            InputStream is=null;
            OutputStream os=null;
            try {
                is = new FileInputStream(file);
                String path=ServletActionContext.getServletContext().getRealPath("upload");
                File newFile=new File(path,this.getFileFileName());
                os=new FileOutputStream(newFile);
                byte[] b=new byte[1024];
                int len=0;
                while((len=is.read(b))!=-1){
                    os.write(b, 0, len);
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }        
            try {
                    
                if(is!=null)is.close();
                if(os!=null)os.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            return SUCCESS;
        }
    
    }
    
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'login.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
    
      </head>
      
      <body>
        <s:form action="upload" method="post" enctype="multipart/form-data" namespace="/">
        <s:file name="file"></s:file>
        <s:submit label="OK"></s:submit>
        </s:form>
      </body>
    </html>
    
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@taglib prefix="s" uri="/struts-tags"  %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'success.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
    
      </head>
      
      <body>
        <s:iterator var="t" value="#request.fileName">
          <s:property value="t"/>
        </s:iterator>
        <!--
        <s:property value="#request.fileFileName"/> <br/>
        -->
        <!-- 该对象既被存放在值栈中又被存放在request对象内 -->
        <!--<s:property value="fileFileName"/> -->
      </body>
    </html>
    
    <?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>
    
        <package name="default" extends="struts-default" namespace="/">
           <action name="upload" class="com.upload.UploadAction">
              <interceptor-ref name="fileUpload"/>
              <interceptor-ref name="defaultStack"></interceptor-ref>
              <result>/jsp/upload/success.jsp</result>
           </action>
           
           <action name="fileupload" class="com.upload.FilesUploadAction">
              <interceptor-ref name="fileUpload"/>
              <interceptor-ref name="defaultStack"></interceptor-ref>
              <result>/jsp/upload/success.jsp</result>
           </action>
        </package>
      
    </struts>

    上传多个文件:

    struts.xml和success.xml共用
    
    package com.upload;
    
    import java.io.*;
    import java.util.*;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    
    public class FilesUploadAction extends ActionSupport {
        private List<File> file;
        private List<String> fileFileName;
        private List<String> fileContentType;
        public List<File> getFile() {
            return file;
        }
        public void setFile(List<File> file) {
            this.file = file;
        }
        public List<String> getFileFileName() {
            return fileFileName;
        }
        public void setFileFileName(List<String> fileFileName) {
            this.fileFileName = fileFileName;
        }
        public List<String> getFileContentType() {
            return fileContentType;
        }
        public void setFileContentType(List<String> fileContentType) {
            this.fileContentType = fileContentType;
        }
        
        public String execute(){
            String root=ServletActionContext.getServletContext().getRealPath("/")+"/upload";
            List<File> fy=file;
            InputStream is=null;
            OutputStream os=null;
            
            for(int i=0;i<fy.size();i++){
                
                try {
                    byte[] buffer=new byte[1024];
                    is=new FileInputStream(file.get(i));
                    File newFile=new File(root,fileFileName.get(i));
                    os=new FileOutputStream(newFile);
                    int len=0;
                    while((len=is.read(buffer))!=-1){
                        os.write(buffer,0,len);
                        os.flush();
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }finally{
                    is=null;
                    os=null;
                }
            }
            return "success";
        }
    
    }
    
    
    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%@ taglib prefix="s" uri="/struts-tags" %>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <base href="<%=basePath%>">
        
        <title>My JSP 'login.jsp' starting page</title>
        
        <meta http-equiv="pragma" content="no-cache">
        <meta http-equiv="cache-control" content="no-cache">
        <meta http-equiv="expires" content="0">    
        <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
        <meta http-equiv="description" content="This is my page">
        <!--
        <link rel="stylesheet" type="text/css" href="styles.css">
        -->
    
      </head>
      
      <body>
        <s:form action="fileupload" method="post" enctype="multipart/form-data" namespace="/">
        <s:file name="file"></s:file><br/>
        <s:file name="file"></s:file><br/>
        <s:file name="file"></s:file>
        <s:submit label="OK"></s:submit>
        </s:form>
      </body>
    </html>
  • 相关阅读:
    【Python五篇慢慢弹(3)】函数修行知python
    【Python五篇慢慢弹】数据结构看python
    【项目管理】GitHub使用操作指南
    【Python五篇慢慢弹】快速上手学python
    【NLP】十分钟快览自然语言处理学习总结
    【NLP】条件随机场知识扩展延伸(五)
    【NLP】基于统计学习方法角度谈谈CRF(四)
    【NLP】基于机器学习角度谈谈CRF(三)
    【NLP】基于自然语言处理角度谈谈CRF(二)
    【NLP】前戏:一起走进条件随机场(一)
  • 原文地址:https://www.cnblogs.com/aigeileshei/p/5328992.html
Copyright © 2011-2022 走看看