posts - 22, comments - 17, trackbacks - 0, articles - 15
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

Struts 2多文件上传

Posted on 2008-05-15 10:42 码农cz 阅读(943) 评论(0)  编辑  收藏 所属分类: As u
很多应用都要求在一个界面中可以上传多个文件,Struts 2框架也可以方便地支持多个文件同时上传,一般可以使用数组和List来实现。

 使用数组上传多个文件

1upload.jsp文件

 使用数组实现多个文件上传的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个文件域。使用数组多个上传文件的业务控制器如代码

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

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;

    //属性的gettersetter方法

    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;

    }

    //属性的gettersetter方法

    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的内容如代码所示。

代码 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/TestS/multipleUpload UsingArray.jsp,界面如图所示。

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

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

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

 使用List上传多个文件

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


只有注册用户登录后才能发表评论。


网站导航: