Struts 2多文件上传(11)

11.2  多个文件上传

很多应用都要求在一个界面中可以上传多个文件,Struts 2框架也可以方便地支持多个文件同时上传,一般可以使用数组和List来实现。

11.2.1   使用数组上传多个文件

1)修改前面的upload.jsp文件,如代码11.5所示。

代码11.5  使用数组实现多个文件上传的JSP

<% @ page 

    language
="java" 

    contentType
="text/html; charset=UTF-8"

    pageEncoding
="UTF-8"
%>

<% @ taglib prefix="s" uri="/struts-tags"  %>

< html >

< head >

< title > 使用数组实现多个文件上传 </ title >

</ head >

< body >

< s:form  action ="doMultipleUploadUsingArray"  method ="POST"  enctype ="multipart/form-data" >

    
< s:file  label ="文件1"  name ="upload"   />

    
< s:file  label ="文件2"  name ="upload"   />

    
< s:file  label ="文件3"  name ="upload"   />

    
< s:submit  value ="上传" />    

</ s:form >

</ body >

</ html >

 

2)在该form中,定义了3个具有相同名称的文件域,所以需要在Action实现类中使用数组来封装这3个文件域。使用数组多个上传文件的业务控制器如代码11.6所示。

代码11.6  使用数组上传多个文件的业务控制器

package  ch11;

import  java.io.File;

import  java.text.DateFormat;

import  java.text.SimpleDateFormat;

import  java.util.Date;

import  java.util.Random;

import  org.apache.commons.io.FileUtils;

import  org.apache.struts2.ServletActionContext;

import  com.opensymphony.xwork2.ActionSupport;

public   class  MultipleFileUploadUsingArrayAction  extends  ActionSupport  {

    
private File[] uploads;

    
private String[] uploadFileNames;

    
private String[] uploadContentTypes;

    
private String[] dir;

    
private String[] targetFileName;

    
//属性的getter和setter方法

    
public File[] getUpload() {

        
return this.uploads;

    }


    
public void setUpload(File[] upload) {

        
this.uploads = upload;

    }


    
public String[] getUploadFileName() {

        
return this.uploadFileNames;

    }


    
public void setUploadFileName(String[] uploadFileName) {

        
this.uploadFileNames = uploadFileName;

    }


    
public String[] getUploadContentType() {

        
return this.uploadContentTypes;

    }


    
public void setUploadContentType(String[] uploadContentType) {

        
this.uploadContentTypes = uploadContentType;

    }


    
//文件上传

    
public String upload() throws Exception {

        
// 获得upload路径的实际目录

        String realPath 
= ServletActionContext.getRequest().getRealPath(

                
"/upload");

        
//获得实际目录

        String targetDirectory 
= realPath;

        String[] mydir 
= new String[uploads.length];

        String[] tname 
= new String[uploads.length];

        
for (int i = 0; i < uploads.length; i++{

            
// 生成保存文件的文件名称

            tname[i] 
= generateFileName(uploadFileNames[i]);

            
// 保存文件的路径

            mydir[i] 
= targetDirectory + "/" + tname[i];

            
// 建立一个目标文件

            File target 
= new File(targetDirectory, tname[i]);

            
// 将临时文件复制到目标文件

            FileUtils.copyFile(uploads[i], target);

        }


        setDir(mydir);

        setTargetFileName(tname);

        
return SUCCESS;

    }


    
// 为上传文件自动分配文件名称,避免重复

    
private String generateFileName(String fileName) {

        
// 获得当前时间

        DateFormat format 
= new SimpleDateFormat("yyMMddHHmmss");

        
// 转换为字符串

        String formatDate 
= format.format(new Date());

        
// 随机生成文件编号

        
int random = new Random().nextInt(10000);

        
// 获得文件后缀名称

        
int position = fileName.lastIndexOf(".");

        String extension 
= fileName.substring(position);

        
// 组成一个新的文件名称

        
return formatDate + random + extension;

    }


    
//属性的getter和setter方法

    
public String[] getDir() {

        
return dir;

    }


    
public void setDir(String[] dir) {

        
this.dir = dir;

    }


    
public String[] getTargetFileName() {

        
return targetFileName;

    }


    
public void setTargetFileName(String[] targetFileName) {

        
this.targetFileName = targetFileName;

    }


}


 

说明

使用数组上传多个文件同上传单个文件非常类似,并不复杂。

 

3)在配置文件中增加如下配置:

< action  name ="doMultipleUploadUsingArray"

            class
="ch11.MultipleFileUploadUsingArrayAction"

            method
="upload" >

            
< result > /ch11/multipleUploadUsingArray-success.jsp </ result >

            
< result  name ="input" > /ch11/multipleUploadUsingArray.jsp </ result >

</ action >

 

4multipleUploadUsingArray-success.jsp的内容如代码11.7所示。

代码11.7  multipleUploadUsingArray-success.jsp内容

<% @ page 

    language
="java" 

    contentType
="text/html; charset=UTF-8"

    pageEncoding
="UTF-8"
%>

<% @ taglib prefix="s" uri="/struts-tags"  %>

< html >

< head >

< title > 多个文件上传示例 </ title >

</ head >

< body >

< table  border ="1" >

<!--   使用迭代标签 -->

< s:iterator  value ="dir"  status ="stat" >

< tr >

    
< td > 文件名称 < s:property  value ="%{#stat.index}"   /></ td >

    
< td >< s:property  value ="%{dir[#stat.index]}"   /></ td >

</ tr >    

</ s:iterator >

</ table >

< table  border ="1" >

<!--   使用迭代标签 -->

< s:iterator  value ="uploadContentType"  status ="stat" >

< tr >

    
< td > 文件类型 < s:property  value ="%{#stat.index}"   /></ td >

    
< td >< s:property  value ="%{uploadContentType[#stat.index]}"   /></ td >

</ tr >

</ s:iterator >

</ table >

< table  border ="1" >

<!--   使用迭代标签 -->

< s:iterator  value ="+targetFileName"  status ="stat" >

< tr >

    
< td > 图片 < s:property  value ="%{#stat.index}"   /></ td >

    
< td >< img  src ="<s:property value=" '/bookcode/upload/'+targetFileName[#stat.index]" /> "/> </ td >

</ tr >

</ s:iterator >

</ table >

</ body >

</ html >

 

5)运行该示例,在浏览器中输入http://localhost:8080/bookcode/ch11/multipleUpload UsingArray.jsp,界面如图11.9所示。

11.9  使用数组上传多个文件界面

6)在这里,选择3gif文件,单击“上传”按钮,结果如图11.10所示。

11.10  使用数组上传多个文件结果

11.2.2   使用List上传多个文件

使用List来上传多个文件同数组基本相同,上传JSP文件和success逻辑视图的JSP文件均不用修改,只是需要相应的Action实现类即可。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值