首页 > 代码库 > struts2上传

struts2上传

关于jsp如何实现文件上传,未来将有博主将有代码贴出来,现在讨论下struts下的文件上传及下载

struts2文件上传技术原理:

1.struts2文件上传的底层支持
在struts.properties配置文件中,配置struts2上传文件时的上传解析器:
struts.multipart.parser=cos指定使用cos的文件上传解析器
struts.multipart.parser=pell指定使用pell的文件上传解析器
struts.multipart.parser=jakarta    指定使用common-fileupload文件上传解析器,默认的
 
2.每个文件上传域  需要在action中提供3个field来封装
(1)与文件上传域的name同名的,类型为File的field
(2)名为文件上传域的name+FileName,类型为string的field
(3) 名为文件上传域的name+ContentType,类型为string的field
其他参数按照普通参数提供field和构造函数

3.使用io流控制将文件写入服务器的物理磁盘即可
4.文件过滤
文件过滤的方式有两种:
a  在action通过代码进行控制。File类型的Field可以获取上传文件的类型
string类型XXXContentType可以获取上传文件的类型,通过判断上传文件大小、文件类型可对上传文件进行过滤
b 使用fileUpload拦截器,只要进行简单的配置即可
(1)启用fileUpload拦截器,当文件过滤失败时struts会返回input逻辑视图名,在struts.xml中配置action,为其指定两个参数,即
---allowedTypes,该参数指定允许上传的文件类型,多个文件类型之间用,隔开,如image/jpeg,image/pjpeg,image/gif,image/png等
---maximumSize:该参数指定允许上传的文件大小,单位是字节(1kb=1024字节)
注意:启用fileUpload拦截器之后,还要手动启动默认拦截器defaultStack:
    <interceptor-ref name="fileUpload">
<!--      maximumSize 字节大小 -->
     <param name="allowedTypes">image/png,image/jpeg,image/pjpeg,image/gif</param>
     <param name="maximumSize">20000</param>   
     </interceptor-ref>
     <interceptor-ref name="defaultStack"></interceptor-ref>

(2)需要为input逻辑视图名配置物理视图资源
 <result name="input">upload.jsp</result>

 

主要实现代码如下

AddPicProAction.java文件,该action实现文件的上传

package com.gree.action;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.UUID;import org.apache.struts2.ServletActionContext;import com.gree.service.PicService;import com.opensymphony.xwork2.ActionSupport;public class AddPicProAction extends ActionSupport {        private String picName;         //每个文件域需要3个field封装    private File pic;          //上传的文件    private String picFileName; //上传文件的原始文件名    private String  picContentType;//上传文件的文件类型    public String getPicName() {        return picName;    }    public void setPicName(String picName) {        this.picName = picName;    }    public File getPic() {        return pic;    }    public void setPic(File pic) {        this.pic = pic;    }    public String getPicFileName() {        return picFileName;    }    public void setPicFileName(String picFileName) {        this.picFileName = picFileName;    }    public String getPicContentType() {         return picContentType;    }    public void setPicContentType(String picContentType) {        this.picContentType = picContentType;    }    /* (non-Javadoc)     * @see com.opensymphony.xwork2.ActionSupport#execute()     */    @Override    public String execute() throws Exception {        //此处pic就代表了我们的文件,因此此处只要io流将文件写入磁盘即可        String uploadpath=ServletActionContext.getServletContext().getRealPath("/upload");//        String houzui="";//        if(picFileName.lastIndexOf(".")!=-1) {//         houzui =picFileName.substring(picFileName.lastIndexOf("."));  //         }                 String newFileName =picFileName;                                                //这代表要上传的文件,文件上传就是io流        FileOutputStream os=new FileOutputStream(uploadpath+"/"+newFileName);        FileInputStream is=new FileInputStream(pic);         int hasRead=0;                  byte[] buff=new byte[2014];                  while((hasRead=is.read(buff))>0){                          os.write(buff,0,hasRead);                                 }         is.close();         os.close();                  PicService ps=new PicService();         ps.addpic(picName,newFileName);        return SUCCESS;                            }            }

在WebContent根目录下建立一个文件夹upload,如图:

 

struts.xml配置如下:

     <action name="addPicPro" class="com.gree.action.AddPicProAction">              <interceptor-ref name="fileUpload"><!--      maximumSize 字节大小 -->     <param name="allowedTypes">image/png,image/jpeg,image/pjpeg,image/gif</param>     <param name="maximumSize">2000000000000</param>        </interceptor-ref>     <interceptor-ref name="defaultStack"></interceptor-ref>      <result type="chain">listpics</result>      <result name="input">upload.jsp</result>   </action>

 

jsp文件如下:

upload.jsp

<%@ 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 ‘upload.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="http://www.mamicode.com/styles.css">    --><s:head/>  </head>    <body>    <s:form action="addPicPro" enctype="multipart/form-data" method="post" namespace="/">    <s:textfield name="picName" label="图片名"/>    <s:file name="pic" label="选择图片"/>    <s:submit value="上传"/>    </s:form>                     </body></html>

listPicts.jsp

<%@ 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 ‘listPicts.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="http://www.mamicode.com/styles.css">    -->            <script>        function func(o){        document.getElementById("show").src="upload/"+o;            }                </script>  </head><!--   listValue 是文本内容     listKey是value -->  <s:select list="picts" listKey="fileName" listValue="picName" label="请选择图片"   onchange="func(this.value)"/>      <img id="show" width=200/>  <body>  </body></html>

 

好了,有什么问题可回复博主,博主有时间会回答

 

struts2上传