`
sungang_1120
  • 浏览: 312728 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类

Struts2文件上传(多文件)和下载实例代码

阅读更多



 以上是在MyEclipse的存放位置

struts.xml配置如下所示

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
    <constant name="struts.i18n.encoding" value="utf8" />
    <package name="file" namespace="/" extends="struts-default">
        <action name="showUpload" class="org.usc.file.UploadAction" method="showUpload">
            <result>/upload.jsp</result>
        </action>
        <action name="upload" class="org.usc.file.UploadAction">
            <result name="input">/upload.jsp</result>
<!--            <result name="success">/upload_success.jsp</result>-->
            <result name="success">/download.jsp</result>
            <interceptor-ref name="fileUpload">
<!--大家可以设置成自己的配置,想文件类型和大小等限制            -->
<!--                <param name="maximumSize">2097152</param>单位是字节    2M    (2097152B)        -->
<!--                <param name="allowedTypes">image/bmp,image/x-png,image/png,image/gif,image/jpeg,image/jpg,image/pjpeg</param>-->
<!--                -->
<!--                    容许文件类型为doc,ppt,xls,pdf,txt,java-->
<!--                -->
            </interceptor-ref>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>

        <action name="download" class="org.usc.file.DownloadAction">
            <result name="success" type="stream">
                <param name="contentDisposition">attachment;filename="${fileName}"</param>
                <param name="inputName">downloadFile</param>
            </result>
        </action>
    </package>
</struts>

 struts.properties配置如下图所示:

 

 
upload.properties配置可自己随意定义一个路径 如下图所示:


 

上传UploadAction.java代码如下:

package org.usc.file;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext;
import org.usc.utils.UploadConfigurationRead;
import com.opensymphony.xwork2.ActionSupport;

/**
 * 多文件上传类
 *
 * @author
 *
 * @Time
 */
public class UploadAction extends ActionSupport {

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    private File[] upload;// 实际上传文件
    private String[] uploadContentType; // 文件的内容类型
    private String[] uploadFileName; // 上传文件名
    private List<UploadFiles> uploadFiles = new ArrayList<UploadFiles>();

    public String showUpload() {
        return SUCCESS;
    }

    public String execute() throws Exception {
        try {
            String targetDirectory = ServletActionContext.getServletContext()
                    .getRealPath(
                            "/"
                                    + UploadConfigurationRead.getInstance()
                                            .getConfigItem("uploadFilePath")
                                            .trim());// 获得路径
            for (int i = 0; i < upload.length; i++) {
                String fileName = uploadFileName[i];// 上传的文件名
                String type = uploadContentType[i];// 文件类型
                String realName = UUID.randomUUID().toString()
                        + getExt(fileName);// 保存的文件名称,使用UUID+后缀进行保存

                File target = new File(targetDirectory, realName);
                FileUtils.copyFile(upload[i], target);// 上传至服务器的目录,一般都这样操作,
                // 在把路径写入数据库即可

                UploadFiles uf = new UploadFiles();// 创建文件
                uf.setUploadContentType(type);
                uf.setUploadFileName(fileName);
                uf.setUploadRealName(realName);

                uploadFiles.add(uf);// 添加到需要下载文件的List集合中

                // uploadRealName[i]=UUID.randomUUID().toString();
                // System.out.println("uploadRealName:"+uploadRealName[i]);
                // for(File file:upload)
                // {
                // System.out.println("filename:"+file.getName());
                // }
                // System.out.println("filename:"+fileName);
                // System.out.println("Ext:"+getExt(fileName));
                // System.out.println("Type:"+type);
                // System.out.println(target.getPath());
            }
            ServletActionContext.getRequest().setAttribute("uploadFiles",
                    uploadFiles);

        } catch (Exception e) {
            e.printStackTrace();
            addActionError(e.getMessage());

            return INPUT;
        }

        return SUCCESS;

    }

    public File[] getUpload() {
        return upload;
    }

    public void setUpload(File[] upload) {
        this.upload = upload;
    }

    public String[] getUploadContentType() {
        return uploadContentType;
    }

    public void setUploadContentType(String[] uploadContentType) {
        this.uploadContentType = uploadContentType;
    }

    public String[] getUploadFileName() {
        return uploadFileName;
    }

    public void setUploadFileName(String[] uploadFileName) {
        this.uploadFileName = uploadFileName;
    }

    public static String getExt(String fileName) {
        return fileName.substring(fileName.lastIndexOf("."));
    }

}


 下载
DownloadAction.java如下

package org.usc.file;

import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.ServletActionContext;
import org.usc.utils.UploadConfigurationRead;

public class DownloadAction extends ActionSupport
{
    private static final long serialVersionUID = 6329383258366253255L;
    private String fileName;
    private String fileRealName;
    public void setFileName()
    {
        // 得到请求下载的文件名
        String fname = ServletActionContext.getRequest().getParameter("name");
        String frealname = ServletActionContext.getRequest().getParameter("realname");
        try
        {
            /*
             * 对fname参数进行UTF-8解码,注意:实际进行UTF-8解码时会使用本地编码,本机为GBK。
             * 这里使用request.setCharacterEncoding解码无效.
             * 只有解码了getDownloadFile()方法才能在下载目录下正确找到请求的文件
             */
            fname = new String(fname.getBytes("ISO-8859-1"), "UTF-8");
            frealname= new String(frealname.getBytes("ISO-8859-1"), "UTF-8");
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        this.fileName = fname;
        this.fileRealName = frealname;
//        System.out.println(fileName);
//        System.out.println(fileRealName);
    }

    /*
     * @getFileName 此方法对应的是struts.xml文件中的: <param
     * name="contentDisposition">attachment;filename="${fileName}"</param>
     * 这个属性设置的是下载工具下载文件时显示的文件名, 要想正确的显示中文文件名,我们需要对fileName再次编码
     * 否则中文名文件将出现乱码,或无法下载的情况
     */
    public String getFileName() throws UnsupportedEncodingException
    {

        fileRealName = new String(fileRealName.getBytes(), "ISO-8859-1");

        return fileRealName;
    }

    /*
     * @getDownloadFile 此方法对应的是struts.xml文件中的: <param
     * name="inputName">downloadFile</param> 返回下载文件的流,可以参看struts2的源码
     */
    public InputStream getDownloadFile()
    {

        this.setFileName();
        return ServletActionContext.getServletContext().getResourceAsStream("/"+UploadConfigurationRead.getInstance().getConfigItem("uploadFilePath").trim()+"/" + fileName);
    }

    @Override
    public String execute() throws Exception
    {
        return SUCCESS;
    }
}

UploadConfigurationRead.java如下:

package org.usc.utils;

import java.io.File;
import java.io.FileInputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Properties;

/**
 * 动态读取配置文件类
 *
 * @author
 *
 * @Time
 */
public class UploadConfigurationRead {

    /**
     * 属性文件全名,需要的时候请重新配置PFILE
     */
    private static String PFILE = "upload.properties";

    /**
     * 配置文件路径
     */
    private URI uri = null;

    /**
     * 属性文件所对应的属性对象变量
     */
    private long m_lastModifiedTime = 0;

    /**
     * 对应于属性文件的文件对象变量
     */
    private File m_file = null;

    /**
     * 属性文件所对应的属性对象变量
     */
    private Properties m_props = null;

    /**
     * 唯一实例
     */
    private static UploadConfigurationRead m_instance = new UploadConfigurationRead();

    /**
     * 私有构造函数
     *
     * @throws URISyntaxException
     */
    private UploadConfigurationRead() {
        try {
            m_lastModifiedTime = getFile().lastModified();
            if (m_lastModifiedTime == 0) {
                System.err.println(PFILE + "file does not exist!");
            }
            m_props = new Properties();
            m_props.load(new FileInputStream(getFile()));

        } catch (URISyntaxException e) {
            System.err.println(PFILE + "文件路径不正确");
            e.printStackTrace();
        } catch (Exception e) {
            System.err.println(PFILE + "文件读取异常");
            e.printStackTrace();
        }
    }

    /**
     * 查找ClassPath路径获取文件
     *
     * @return File对象
     * @throws URISyntaxException
     */

    private File getFile() throws URISyntaxException {
        URI fileUri = this.getClass().getClassLoader().getResource(PFILE)
                .toURI();
        m_file = new File(fileUri);
        return m_file;
    }

    /**
     * 静态工厂方法
     *
     * @return 返回ConfigurationRead的单一实例
     */
    public synchronized static UploadConfigurationRead getInstance() {
        return m_instance;
    }

    /**
     * 读取一特定的属性项
     */
    public String getConfigItem(String name, String defaultVal) {
        long newTime = m_file.lastModified();
        // 检查属性文件是否被修改
        if (newTime == 0) {
            // 属性文件不存在
            if (m_lastModifiedTime == 0) {
                System.err.println(PFILE + " file does not exist!");
            } else {
                System.err.println(PFILE + " file was deleted!!");
            }
            return defaultVal;
        } else if (newTime > m_lastModifiedTime) {
            m_props.clear();
            try {
                m_props.load(new FileInputStream(getFile()));
            } catch (Exception e) {
                System.err.println("文件重新读取异常");
                e.printStackTrace();
            }
        }
        m_lastModifiedTime = newTime;
        String val = m_props.getProperty(name);
        if (val == null) {
            return defaultVal;
        } else {
            return val;
        }
    }

    /**
     * 读取一特定的属性项
     *
     * @param name
     *            属性项的项名
     * @return 属性项的值(如此项存在), 空(如此项不存在)
     */
    public String getConfigItem(String name) {
        return getConfigItem(name, "");
    }

}

UploadFiles.java代码如下

package org.usc.file;

/**
 * 文件类,需要的时候,可以和数据库进行关联
 *
 * @author
 *
 * @Time
 */
public class UploadFiles {
    private String uploadFileName;// 上传的文件名称
    private String uploadContentType;// 类型
    private String uploadRealName;// 保存的文件真实名称,UUID

    // 如果使用数据库的话,建议这三个字段都进行保存
    public String getUploadFileName() {
        return uploadFileName;
    }

    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }

    public String getUploadContentType() {
        return uploadContentType;
    }

    public void setUploadContentType(String uploadContentType) {
        this.uploadContentType = uploadContentType;
    }

    public String getUploadRealName() {
        return uploadRealName;
    }

    public void setUploadRealName(String uploadRealName) {
        this.uploadRealName = uploadRealName;
    }

}
上传upload.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
    <head>
        <title>upload</title>

    </head>
    <body>

        <script type="text/javascript">

<!--addMore函数可以提供上传多个文件上传-->

function addMore()
{

    var td = document.getElementById("more");
    
    var br = document.createElement("br");
    var input = document.createElement("input");
    var button = document.createElement("input");
    
    input.type = "file";
    input.name = "upload";
    
    button.type = "button";
    button.value = "   删除    ";
    
    button.onclick = function()
    {
        td.removeChild(br);
        td.removeChild(input);
        td.removeChild(button);
    }
    
    td.appendChild(br);
    td.appendChild(input);
    td.appendChild(button);
}

</script>

        <!--<h3><font color="red">上传文件类型后缀为doc,ppt,xls,pdf,txt,java,每个文件大小不能大于50M</font></h3>-->

        <table align="center" width="50%">
            <tr>
                <td>
                    <s:fielderror cssStyle="color:red" />
                </td>
            </tr>
        </table>
        
        <s:form action="upload.action" theme="simple" method="post"
            enctype="multipart/form-data">

            <table align="center" width="50%" border="1">
                <tr>
                    <td>
                        上传文件
                    </td>
                    <td id="more" >
                        <s:file name="upload"></s:file>
                        <input type="button" value="上传更多..." onclick="addMore()">
                    </td>
                </tr>
                <tr>
                    <td>
                        <s:submit value=" 确认 "></s:submit>
                    </td>
                    <td>
                        <s:reset value=" 重置 "></s:reset>
                    </td>
                </tr>

            </table>

        </s:form>

    </body>


</html>
下载download.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="s" uri="/struts-tags"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<html>
    <head>
        <title>download</title>
    </head>
    <body>
        <table align="center" width="50%" border="1">
            <tr>
                <td align="center">
                    文件下载
                </td>
            </tr>
            <c:forEach var="uploadFiles" items="${uploadFiles}">
                <tr>
                    <td>
                        <a
                            href="download.action?name=${uploadFiles.uploadRealName }&realname=${uploadFiles.uploadFileName }">${uploadFiles.uploadFileName
                            }</a>
                    </td>
                </tr>

            </c:forEach>


        </table>
    </body>
</html>

输入地址:localhost:8080/struts2_0610_FileUpLoadAndDownLoad/showUpload.action

    显示如下图所示:

 上传之后:



 

 


 

  • 大小: 50 KB
  • 大小: 14.1 KB
  • 大小: 8.6 KB
  • 大小: 23.6 KB
  • 大小: 33.8 KB
分享到:
评论

相关推荐

    JAVA COS上传实例支持Struts2

    COS相比其它上传文件组件而言,除了具有速度优势外,其使用的便携性是非常好的,一两句简单地代码就搞定了COS对多文件的上传(指定下保存的地址、总文件上传大小限制、文件重命名策略[可选]、编码等),不像...

    Struts2 文件上传进度条的实现实例代码

    本篇文章主要介绍了Struts2 文件上传进度条的实现实例代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    struts1.0的上传代码

    struts1.0的上传代码实例,自己导入struts1的lib包。

    STRUTS 2完全学习手册.pdf

    包括Struts 2中配置文件的详细讲解、国际化与异常处理、数据类型的转换、数据的输入校验、Struts 2强大的标签库、Struts 2中文件的上传与下载、Struts 2对Ajax的支持、Struts 2与流行框架的整合,最后以3个实例由...

    文件上传实例-JAVA

    这是一个运用java语言编写的web文件上传实例代码,已经可以运行了,是通过手动代码的方式实现的文件上传,暂时没有运用Struts2框架中的文件上传组件,如果有用可以下载去看看。

    Struts实现任意文件的快速上传和下载

    Struts实现任意文件的快速上传和下载,有完整的实例代码,附加即可看到效果......

    Struts2 控制文件上传下载功能实例代码

    主要介绍了Struts2 控制文件上传下载功能实例代码,非常不错,具有参考借鉴价值,需要的朋友可以参考下

    Struts2入门教程(全新完整版)

    九、文件上传下载(了解) 55 1. 上传实例 55 2.下载实例 57 十、类型转换 57 1.基于Action的直接属性转换 57 2.基于Action的间接属性vo转换 59 十一、注解配置 59 十二、总结 本教程对struts2的基本知识进行了一些...

    WebUploader上传文件实例(Java Struts2版).zip

    WebUploader ajax上传 demo,对多个文件的选中上传判断和删除显示

    struts2.0文件的上传与下载

    里面包括了文件上传的jsp页面和action中的处理代码。可以清楚的知道文件上传与下载的工作原理

    JSP网络编程从基础到实践的实例代码

    JSP网络编程从基础到实践的实例代码 《JSP网络编程从基础到实践》光盘说明 光盘的实例代码目录中包含了前10章的所有实例的源代码,实例名称及其所处章节如下: 第1章 JSP技术概述 实例1 第一个JSP页面 第3章 Web...

    JEE2实现文件上传

    在 JEE2 中,我们可以使用 Servlet 和 JSP 来实现文件上传。 首先,我们需要了解 HTTP 请求的机制。HTTP 请求是指客户端向服务器端发送请求的过程。在文件上传过程中,我们需要了解如何解析 HTTP 请求中的文件信息...

    JSP网络编程从基础到实践 实例代码

    光盘的实例代码目录中包含了前10章的所有实例的源代码,实例名称及其所处章节如下: 第1章 JSP技术概述 实例1 第一个JSP页面 第3章 Web开发基础 实例2 HTML与JavaScript交互示例 第4章 JSP语法 实例3 JSP程序的...

    struts-2官网下载jar包和例子

    struts-2.3.14官网下载,因为文件过大,限制上传文件的大小,故把源代码分离,该zip文件中包含官方jar包和例子 源码下载地址 http://download.csdn.net/detail/ahuangtaoa/5380477

    超帅的文件上传插件Uploadify在Struts2中的应用,完整详细实例!

    —》最近由于项目需要使用到一个上传插件,在网上发现uploadify挺不错,所以决定使用它,但是官网文档和例子是php的,而项目是SSI框架的,所以自己对uploadify在struts2中的使用进行了一番研究,最终实现了。...

    JAVA上百实例源码以及开源项目源代码

    Java圆形按钮实例代码,含注释 两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟  用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有...

    (2.0版本)自己写的struts2+hibernate+spring实例

    所以没有上传导入的jar,其实就是默认的struts2和hibernate以及spring的包.该项目使用的jar包为以下. spring-beans.jar xwork-2.0.4.jar spring-context.jar ognl-2.6.11.jar spring-web.jar ...

    struts2+jsp实现文件上传的方法

    本文实例讲述了struts2+jsp实现文件上传的方法。分享给大家供大家参考。具体如下: 1. java代码: package com.wang.test; import java.io.InputStream; import org.apache.struts2.ServletActionContext; import ...

Global site tag (gtag.js) - Google Analytics