Struts1.x系列教程(9):上传任意多个文件

简介: 本文为原创,如需转载,请注明作者和出处,谢谢! 上一篇:Struts1.x系列教程(8):上传单个文件 Struts2教程7:上传任意多个文件    从《Struts1.x系列教程(8):上传单个文件》中给出的例子可以看出,在Struts1.x中上传单个文件是非常简单的,但在实际应用中,上传文件的个数一般是不确定的,如在网络硬盘中,用户可以根据自己的需要上传任意多个文件(当然,网络硬盘一次上传文件的数目一般也是有上限的,如50个,但用户可以只上传了3个文件,因此,在这种情况下,上传文件的个数也是不确定的)。
{font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1;} @font-face {font-family:""@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; font-family:"Times New Roman";} /* Page Definitions */ @page {} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 90.0pt 72.0pt 90.0pt;} div.Section1 {page:Section1;} -->

   

【第1步】建立上传文件的JSP页面
    要想实现上述的功能,需要在JavaScript中使用DOM技术(关于JavaScriptDOM技术的相关内容已经超出本文讨论的范围,如果读者想了解JavaScriptDOM技术的细节部分,请参阅其他相关技术资料)。  
    在目录中建立一个uploadMoreFile.jsp文件,代码如下:

  
  

  
< html >
      
< head >
          
< title > 上传任意多个文件(总大小不能超过2M) </ title >
  
< script  language ="javascript" >
  
//  在DOM中插入一个上传文件列表项(div元素)和一个元素
   function  insertNextFile(obj) 
  { 
//  获取上传控制个数
       var  childnum  =  document.getElementById( " files " ).getElementsByTagName( " input " ).length;       
      
var  id  =  childnum  -   1 ;
      
var  fullName  =  obj.value;
      
//  插入
元素及其子元素
       var  fileHtml  =  '';
      fileHtml 
+=  ' < div  id  =   " file_preview' + id + ' "  style  = " border-bottom: 1px solid #CCC; " > ';
      fileHtml 
+=  ' < img  width  = 30  height  =   30  src  = " images/file.gif "  title = " ' + fullName + ' " /> ';
      fileHtml 
+=  ' < a href = " javascript:; "  onclick = " removeFile(' + id + '); " > 删除 </ a >   & nbsp; & nbsp;';
      fileHtml 
+=  fullName.substr(fullName.lastIndexOf('//') + 1 + '   </ div > ';
  
      
var  fileElement  =  document.getElementById( " files_preview " );
      fileElement.innerHTML 
=  fileElement.innerHTML  +  fileHtml;    
      obj.style.display 
=  'none';    //  隐藏当前的元素
      addUploadFile(childnum);   //  插入新的元素
  }
  
//   插入新的元素,适合于不同的浏览器(包括IE、FireFox等)
   function  addUploadFile(index)
  {
      
try    //  用于IE浏览器
      {   
          
var  uploadHTML  =  document.createElement(  " " + index +
                                  "
' name='file[" + index + "]' onchange='insertNextFile(this)'/>");
          document.getElementById(
"files").appendChild(uploadHTML);
      }
      
catch(e)  // 用于其他浏览器
      { 
          
var uploadObj = document.createElement("input");
          uploadObj.setAttribute(
"name""file[" + index + "]");
          uploadObj.setAttribute(
"onchange""insertNextFile(this)");
          uploadObj.setAttribute(
"type""file");
          uploadObj.setAttribute(
"id""file_" + index);
          document.getElementById(
"files").appendChild(uploadObj);
      }
  }
  
function removeFile(index)  // 删除当前文件的
和元素
  {
      document.getElementById(
" files_preview " ).removeChild(document.getElementById( " file_preview "   +  index)); 
      document.getElementById(
" files " ).removeChild(document.getElementById( " file_ "   +  index));    
  }
  
function  showStatus(obj)   //  显示“正在上传文件”提示信息
  {
    document.getElementById(
" status " ).style.visibility = " visible " ;
  }
  
</ script >
      
</ head >
      
< body >
          
< html:form   enctype ="multipart/form-data"  action ="uploadMoreFile" >
              
< span  id ="files" >    
                  
< input   type ="file"  id ="file_0"  name ="file[0]"  onchange ="insertNextFile(this)"   />
               
</ span >   
               
< html:submit  value =" 上传 "  onclick ="showStatus(this);" />
          
</ html:form >    < p >
          
< div  id  ="status"  style ="visibility:hidden;color:Red" > 正在上传文件 </ div >   < p >
          

          
< div  id ="files_preview"  style  ="width:500px;height:500px; overflow :auto"   ></ div >   
      
</ body >
  
</ html >

    uploadMoreFile.jsp文件中使用了JavaScriptDOM技术来控制新加入的上传文件以及删除不需要的上传文件。并且在加入元素时考虑了不同的浏览器的差异(详见addUploadFile)。

【第2步】建立ActionForm的子类

    工程目录>/src/actionform目录中建立一个UploadMoreForm.java文件,代码如下:

   package  actionform;
  
import  org.apache.struts.action. * ;
  
import  org.apache.struts.upload.FormFile;
  
import  java.util. * ;
  
public   class  UploadMoreForm  extends  ActionForm
  {
      
private  List < FormFile >  myFiles  =   new  ArrayList < FormFile > ();   //  用于保存不定数量的FormFile对象
  
      
public  FormFile getFile( int  i)   //  索引属性
      {
          
return  myFiles.get(i);
      }
      
public   void  setFile( int  i, FormFile myFile)   //  索引属性
      {
          
if  (myFile.getFileSize()  >   0 )   //  只有上传文件的字节数大于0,才上传这个文件
          {
              myFiles.add(myFile);
          }
      }
      
public   int  getFileCount()   //  获得上传文件的个数
      {
          
return  myFiles.size();
      }
  }

    UploadMoreFile 类中使用了List 对象来保存不定数量的FormFile 对象。读者也可以使用其他的集合类来保存这些FormFile 对象。而且在UploadMoreFile 类中使用了带索引的属性,详见getFile setFile 方法。在这两个方法中,第一个参数是一个int 类型的变量。要注意的是,索引属性的get set 方法的第一个参数必须是int 类型的变量,否则系统会不认这个索引属性。这个索引属性用于和客户端不定数量的 元素相对应,每一个索引项代表一个 元素上传的文件(FormFile 对象)。

【第 3 步】 建立Struts 动作类(Action 的子类)

    由于在《Struts1.x系列教程(8):上传单个文件》一文的例子中UploadAction类中已经有了一个saveFile方法用于保存单个上传文件,因此,处理多个上传文件的Struts动作类可以从UploadAction类继承。在工程目录>/src/action目录中建立一个UploadMoreAction.java文件,代码如下:

   package  action;
  
  
import  javax.servlet.http. * ;
  
import  org.apache.struts.action. * ;
  
import  org.apache.struts.upload.FormFile;
  
import  java.io. * ;
  
import  actionform. * ;
  
  
public   class  UploadMoreAction  extends  UploadAction
  {  
      
public  ActionForward execute(ActionMapping mapping, ActionForm form,
              HttpServletRequest request, HttpServletResponse response)
      {
          UploadMoreForm umForm 
=  (UploadMoreForm) form;
          PrintWriter out 
=   null ;
          
int  count  =   0 ;
          
try
          {
              response.setCharacterEncoding(
" GBK " );
              out 
=  response.getWriter();
              count 
=  umForm.getFileCount();    //  获得上传文件的总数
               for  ( int  i  =   0 ; i  <  count; i ++ )
              {
                  saveFile(umForm.getFile(i));  
//  开始保存每一个上传文件          
              }
              out.println(
" 成功上传 "   +  String.valueOf(count)  +   " 个文件. " );
          }
          
catch  (Exception e)
          {
              out.println(e.getMessage());
          }
          
return   null ;
      }
  }

【第 4 步】 配置struts-config.xml

    在这一步来配置一下在第2步和第3步分别建立的ActionForm和Action的子类。打开struts-config.xml文件,在元素中加入如下的子元素:
< form-bean  name ="uploadMoreForm"  type ="actionform.UploadMoreForm"   />                

    在元素中加入如下的子元素:
   < action  name ="uploadMoreForm"  path ="/uploadMoreFile"  scope ="request" type ="action.UploadMoreAction"   />

【第 5 步】 复制gif 图片

    本例中使用了一个gif图,在Web根目录中建立一个images目录,并复制一个file.gif文件(30*30)到这个目录(读者可以使用自己喜欢的任何gif图片)。
    由于在

目录
相关文章
|
存储 弹性计算 安全
阿里云服务器怎么样?云服务器ECS产品优势、应用场景、价格解析及常见问题参考
阿里云服务器ECS(Elastic Compute Service)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。把物理服务器比作买的房子,云服务器ECS,就是租赁的房子,阿里云云服务商就是管家。云服务商负责搭建机房、提供配套服务和维护,用户只需要付租金,即可“拎包入住”,无需自建机房、采购和配置硬件设施。如果不再需要云服务器,可随时“退租”(释放资源),节省成本。本文为大家解析云服务器ECS产品优势、应用场景和最新价格及常见问题。
阿里云服务器怎么样?云服务器ECS产品优势、应用场景、价格解析及常见问题参考
|
存储 安全 Android开发
安卓安全性指南:保护用户数据免受恶意攻击
【4月更文挑战第13天】本文是安卓应用安全开发指南,强调了在数字化时代保护移动设备安全的重要性,特别是针对安卓平台。开发者应理解安卓的安全架构,使用最新SDK,安全存储数据(如加密和权限管理),执行代码安全实践,应用签名,遵循安全编码标准,定期审计,及用户教育。通过这些措施,可降低应用遭受恶意攻击的风险,确保用户数据安全。
541 6
|
存储 关系型数据库 MySQL
Python导入Excel数据到MySQL数据库
Python导入Excel数据到MySQL数据库
1042 1
|
人工智能 程序员 API
【AI大模型应用开发】1.0 Prompt Engineering(提示词工程)- 典型构成、原则与技巧,代码中加入Prompt
【AI大模型应用开发】1.0 Prompt Engineering(提示词工程)- 典型构成、原则与技巧,代码中加入Prompt
725 0
|
开发框架 自然语言处理 达摩院
MindOpt APL,可以支持调用几十种求解器的建模语言
建模语言可以提供更高级、更灵活的问题描述方式,从而提高问题的理解和求解效率。它可以加速问题的开发和部署过程,促进不同领域之间的合作和交流,从而推动问题求解的进展和创新。
|
安全 Linux iOS开发
【漏洞扫描工具】Acunetix-Web应用系统漏扫工具
Acunetix-Web应用系统漏扫工具,下载安装包以及破解补丁。
722 1
|
Java Apache Scala
Doris FE源码解读系列之源码编译踩坑!!!(上)
Doris FE源码解读系列之源码编译踩坑!!!
1210 1
Doris FE源码解读系列之源码编译踩坑!!!(上)
|
前端开发 JavaScript
3D魔方小游戏(附源码)
一说到魔方 想必大家都熟悉的不能再熟悉了 自己或者曾今自己的朋友非常喜欢玩的一款游戏 言归正卷 那么实用前端的技术怎么实现3D的魔方制作呢 从以下几个方面就不难发现 前端实现3D魔方都得需要用上这些技术栈
3D魔方小游戏(附源码)
|
SQL Java 数据库连接
Mybatis从小白到小黑(四)MyBatis实现复杂环境的Sql查询
在前面的学习中,我们差不多把Mybatis的基本增删改查、配置文件的配置都讲解了一遍,但是在实际的开发中我们编写的sql不会那么简单,今天就来模拟复杂环境的Sql查询
|
存储 移动开发 小程序
家校协同小程序实战教程
家校协同小程序实战教程
家校协同小程序实战教程