Struts2文件上传的运行过程实现


1.1.  文件上传的实现步骤

1)在表单<form>标签设置属性enctype的值为"multipart/form-data", enctype属性用于指定表单数据的编码方式, “multipart/form-data"编码方式指定以二进制流的方处理表单数据,并把文件域指定文件的内容封装在请求参数中。

<form name=""action="" method="post"enctype="multipart/form-data">

2)在jsp页面添加文件域标签<input type="file" name="xxx"/>, name属性用于指定文件域的名称。

3)在Action类中定义3个属性来封装该文件域的信息:

a. 类型为File的xxx属性封装该文件域对应的文件内容。

b. 类型为String的xxxFileName属性封装文件域对应的文件的文件名。

c. 类型为String的xxxContentType属性封装文件域对应的文件的文件类型。

Example:

JSP页面:

<formname="" action="" method="post"enctype="multipart/form-data">

<input type="file"name="upload"/>

<inputtype="submit"/>

</form>

Action类:

private File upload; //上传文件的File对象

private String uploadFileName; //上传文件的文件名

private String uploadContentType; //上传文件的内容类型

//getter & setter方法

4)在Action类的业务方法中将File对象复制到服务器端对应的目录下。

//工具方法,将文件source的内容复制到文件dest中

publicstaticvoid copyFile(File source,File dest) throws Exception{

//创建输入流和输出流

FileInputStream fis=new FileInputStream(source);

FileOutputStream fos=new FileOutputStream(dest);

//fis--->fos

byte[] b=newbyte[1024];

int len;

while((len=fis.read(b))!=-1){

fos.write(b, 0, len);

}

//关闭流

fis.close();

fos.close();

}

1.2.    Struts2文件上传的运行过程

1)fileupload拦截器将浏览器端的文件复制到服务端的临时目录下(由struts.multipart.saveDir指定):

客户端文件 ---> saveDir/临时文件

2)fileupload拦截器创建临时文件的File对象,赋给Action类对应File类型的upload属性:

saveDir/临时文件 ---> File upload

同时设置uploadFileName属性和uploadContentType属性。

3)在Action类将File upload复制到服务器端指定的目录下:

File upload ---> images/uploadFileName

------------------------------------------------------------------>

具体实现

1.测试页面,主要关注文件域开始以及相应form表单跳转的action链接

  1. <%@ page language="java" contentType="text/html; charset=utf-8"  
  2.     pageEncoding="utf-8"%>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
  7. <title>用户注册</title>  
  8. <link type="text/css" rel="stylesheet" href="/dang/css/user.css"/>  
  9. <script charset="gbk" type="text/javascript"  src="/dang/js/jquery-1.4.1.js"></script>  
  10. <script charset="gbk" type="text/javascript"  src="/dang/js/jquery.validate.js"></script>  
  11. <script type="text/javascript">  
  12.     //跟换验证码  
  13.     function changVcode(){  
  14.         //获取图像对象的元素对象  
  15.         var idVcode = document.getElementById("idVcode");  
  16.         //改变其属性  
  17.         idVcode.src="/dang/vcode.action?d="  
  18.                 +new Date().getTime();  
  19.     }  
  20. </script>  
  21. <script type="text/javascript">  
  22.  $(function(){  
  23.      //表单验证  
  24.      $('#registerForm').validate({  
  25.        rules:{  
  26.          'user.userName':{required:true},  
  27.          'user.nickname':{required:true,minlength:4,maxlength:20},  
  28.          'user.userPassword':{required:true,minlength:6,maxlength:20},  
  29.          passwordAgain:{required:true,equalTo:'#txtPassword'},  
  30.          'user.email':{required:true,email:true},  
  31.          vcode:{required:true}  
  32.        },  
  33.        messages:{  
  34.          'user.userName':{required:"<img src='/dang/images/wrong.gif'/>用户名不能为空"},  
  35.          'user.nickname':{required:"<img src='/dang/images/wrong.gif'/>昵称不能为空",  
  36.                           minlength:"<img src='/dang/images/wrong.gif'/>昵称的长度不能少于{0}位",  
  37.                           maxlength:"<img src='/dang/images/wrong.gif'/>昵称的长度不能大于{0}位"},  
  38.          'user.userPassword':{required:"<img src='/dang/images/wrong.gif'/>密码不能为空",  
  39.                               minlength:"<img src='/dang/images/wrong.gif'/>密码的长度不能少于{0}位",  
  40.                               maxlength:"<img src='/dang/images/wrong.gif'/>密码的长度不能大于{0}位"},  
  41.          passwordAgain:{required:"<img src='/dang/images/wrong.gif'/>确认密码不能为空",  
  42.                     equalTo:"<img src='/dang/images/wrong.gif'/>确认密码和密码不相等"},                            
  43.          'user.email':{required:"<img src='/dang/images/wrong.gif'/>Email地址不能为空",  
  44.                        email:"<img src='/dang/images/wrong.gif'/>Email地址格式无效"},  
  45.          vcode:{required:"<img src='/dang/images/wrong.gif'/>验证码不能为空"}  
  46.        },  
  47.        errorPlacement:function(error,element){  
  48.          error.appendTo(  
  49.         element.parent().next().find("span").eq(0));          
  50.        }  
  51.      });  
  52.    });  
  53. </script>  
  54. </head>  
  55. <body>  
  56. <div class="container">  
  57.    <!-- header begin -->  
  58.    <div class="header">  
  59.      <a href="http://localhost:8080/dang">  
  60.        <img border="0" alt="我的当当网" src="/dang/images/logo_20110808.png"/>  
  61.      </a>  
  62.    </div>  
  63.    <!-- header end -->  
  64.    <!-- middle begin -->  
  65.    <div class="middle register">  
  66.       <h1>欢迎注册我的当当网!</h1>  
  67.       <div>  
  68.       <span class="error"></span>  
  69.        <form id="registerForm" name="registerForm"   
  70.              enctype="multipart/form-data"    
  71.              action="/dang/user/register.action"  
  72.              method="post">    
  73.          <table>  
  74.            <tr><td class="c1">请输入您的用户名:</td>  
  75.                <td class="c2">               
  76.                 <input id="userName" name="user.userName"/>  
  77.                </td>  
  78.                <td class="c3">  
  79.                 <span id="userNameInfo" class="info"></span>  
  80.                </td></tr>  
  81.            <!-- 文件域开始 -->  
  82.            <tr><td class="c1">上传头像</td>  
  83.                 <td class="c2"><input type="file" name="upload"></td>  
  84.            </tr>  
  85.            <tr><td class="c3"></td></tr>  
  86.            <!-- 文件域开始 -->  
  87.            <tr><td class="c1">设置您的昵称:</td>  
  88.                <td class="c2"><input name="user.nickname"/></td>  
  89.                <td class="c3">  
  90.                <span class="tip">您的昵称由英文字母、数字、中文组成,长度为4-20个字符<br/></span>  
  91.                </td></tr>  
  92.            <tr><td class="c1">设置密码:</td>  
  93.                <td class="c2"><input id="txtPassword" type="password" name="user.userPassword"/></td>  
  94.                <td class="c3"><span class="tip">你的密码由英文字母、数字组成,长度6-20位<br/></span></td></tr>  
  95.            <tr><td class="c1">再次输入您设置的密码:</td>  
  96.                <td class="c2"><input type="password" name="passwordAgain"/></td>  
  97.                <td class="c3">  
  98.                <span class="tip"></span>  
  99.                </td></tr>  
  100.            <tr><td class="c1">请填写您的Email地址:</td>  
  101.                <td class="c2"><input name="user.email"/></td>  
  102.                <td class="c3"><span class="tip"></span></td></tr>  
  103.            <tr><td class="c1">验证码:</td>  
  104.                <td class="c2">  
  105.                  <input name="vcode" style="width:96px;"/>  
  106.                  <img id="idVcode" alt="验证码" src="/dang/vcode.action" align="bottom" style="height:20px;"/>  
  107.                </td>  
  108.                <td class="c3">  
  109.                   <span class="tip">请输入图片中文字    
  110.                   <a id="idRefresh" href="#" onclick="changVcode()">看不清,再换一张</a>  
  111.                   <br/>  
  112.                   <font color="red">${vcode_info}</font>  
  113.                   </span>  
  114.                </td></tr>  
  115.          </table>  
  116.          <div>  
  117.          <input id="btn_register" type="image" class="btn_register" alt=""   
  118.                 src="/dang/images/register.jpg"/>                 
  119.                  
  120.         </div>  
  121.        </form>  
  122.       </div>  
  123.    </div>  
  124.    <!-- middle end -->  
  125.    <!-- footer begin -->  
  126.    <div class="footer">  
  127.        Copyright © dangdang v2.0, 2011-2012, All Rights Reserved  
  128.            |     京ICP证08000853号  北京达内科技有限公司  
  129.         <br/>  
  130.         <img alt="" src="/dang/images/validate.gif"/>      
  131.         <img alt="" src="/dang/images/knetSealLogo.png"/>  
  132.    </div>  
  133.    <!-- footer end -->  
  134. </div>  
  135. </body>  
  136. </html>  
  • 1
  • 2
  • 3
  • 下一页

相关内容