Struts2文件的上传和下载实现
<一>简述:
Struts2的文件上传其实也是通过拦截器来实现的,只是该拦截器定义为默认拦截器了,所以不用自己去手工配置,<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>
<二>指定用户上传文件的大小,有两种方式:
1)默认是在default.properties 文件的 struts.multipart.maxSize=2097152  键值指定为2097152 也就是2M,通过计算 2097152/(1024*1024) = 2 M
那我们可以改变其默认值,只要在src目录下,新建一个 struts.properties 文件,指定上传大小 如下:

一次上传只可以上传10M,不管一次上传多少个文件,按总和计算
2)在struts.xml文件中指定,如图:

其实name就对应struts.properties的键,value对应 值
注意:如果即在struts.properties设定文件上传大小,又在struts.xml 设定文件上传大小,则struts.properties的优先级高于struts.xml,一般在一处指定上传大小即可,推荐 struts.properties
一、单文件上传
首先是一个jsp文件上传页面,这个比较简单,就是一个表单,里面有个文件上传框
<!--在进行文件上传时,表单提交方式一定要是post的方式,因为文件上传时二进制文件可能会很大,还有就是enctype属性,这个属性一定要写成multipart/form-data,
不然就会以二进制文本上传到服务器端-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>文件上传</h1>
<form action="Upload_upload" method="post" enctype="multipart/form-data">
标题:<input type="text" name="title"><br>
附件:<input type="file" name="file"><br>
<input type="submit" value="submit">
</form>
</body>
</html>
接下来是UploadAction部分代码,因为struts2对上传和下载都提供了很好的实习机制,所以在action这段我们只需要写很少的代码就行:
public class UploadAction extends ActionSupport{
    private String title;
        //注意,file并不是指前端jsp上传过来的文件本身,而是文件上传过来存放在临时文件夹下面的文件
    private File file;
        //提交过来的file的名字
    private String fileFileName;
        //提交过来的file的MIME类型
    private String fileContentType;
    public String getFileContentType() {
        return fileContentType;
    }
    public void setFileContentType(String fileContentType) {
        this.fileContentType = fileContentType;
    }
    public String getFileFileName() {
        return fileFileName;
    }
    public void setFileFileName(String fileFileName) {
        this.fileFileName = fileFileName;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public File getFile() {
        return file;
    }
    public void setFile(File file) {
        this.file = file;
    }
    public String input(){
        return SUCCESS;
    }
    public String upload() throws IOException{
        //System.out.println(file.length());
        //为了防止上传的文件重名,可以在文件前面加当前日期,随机数字,文件名称等
        Random rand = new Random();
        int n = rand.nextInt(9999);
        DecimalFormat format = new DecimalFormat("0000");
        String sss = format.format(n);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
        Date now = Calendar.getInstance().getTime();
        String prefix = sdf.format(now);
        String fileName = prefix +"_"+ sss+"_" + fileFileName;
//        System.out.println(fileFileName);
//        System.out.println(fileContentType );
        File destFile = new File("d:\\"+fileName);
        FileUtils.copyFile(file, destFile);
        return SUCCESS;
    }
}    
首先我们要清楚一点,这里的file并不是真正指代jsp上传过来的文件,当文件上传过来时,struts2首先会寻找struts.multipart.saveDir(这个是在default.properties里面有)这个name所指定的存放位置,我们可以新建一个struts.properties属性文件来指定这个临时文件存放位置,如果没有指定,那么文件会存放在tomcat的apache-tomcat-7.0.29\work\Catalina\localhost\目录下,然后我们可以指定文件上传后的存放位置,通过输出流将其写到流里面就行了,这时我们就可以在文件夹里看到我们上传的文件了。
Strurts.XML文件的配置
<struts>
    <constant name="struts.enable.DynamicMethodInvocation" value="true" />
    <constant name="struts.devMode" value="true" />
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    <constant name="struts.ui.theme" value="simple"></constant>
    <constant name="struts.multipart.maxSize" value="20971520"></constant>
    <package name="default" namespace="/" extends="struts-default">
    <!--通过一个通用的Action就可以实现功能。下面的上传多个文件同理这个Action-->
        <action name="*_*" class="com.itnba.maya.controller.{1}Action" method="{2}">
            <result>{1}/{2}.jsp</result>
        </action>
    </package>
</struts>
struts2多文件上传:
其实多文件上传和单文件上传原理一样,单文件上传过去的是单一的File,多文件上传过去的就是一个List<File>集合或者是一个File[]数组,首先我们来看一下前端jsp部分的代码,这里我用到了jquery来实现动态的添加文件下载框以及动态的删除下载框:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>多文件上传</h1>
<form action="UploadMany_upload" method="post" enctype="multipart/form-data">
标题:<input type="text" name="title"><br>
附件1:<input type="file" name="file"><br>
附件2:<input type="file" name="file"><br>
附件3:<input type="file" name="file"><br>
附件4:<input type="file" name="file"><br>
附件5:<input type="file" name="file"><br>
<input type="submit" value="submit">
</form>
</body>
</html>
file的名字必须都命名成file才行,然后处理多文件上传的action代码如下:
public class UploadManyAction extends ActionSupport{
    private String title;
    private File[] file;//这个位置必须都改成数组的形式
    private String[] fileFileName;
    private String[] fileContentType;
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public File[] getFile() {
        return file;
    }
    public void setFile(File[] file) {
        this.file = file;
    }
    public String[] getFileFileName() {
        return fileFileName;
    }
    public void setFileFileName(String[] fileFileName) {
        this.fileFileName = fileFileName;
    }
    public String[] getFileContentType() {
        return fileContentType;
    }
    public void setFileContentType(String[] fileContentType) {
        this.fileContentType = fileContentType;
    }
    public String input(){
        return SUCCESS;
    }
    public String upload() throws IOException{
        for(int i=0;i<file.length;i++){   //用循环把数组遍历出来然后上传进去,这里的名称修改就不再列出,同理单个文件上传。
            File item = file[i];
            if(item != null){
                File temp = new File("d:\\"+fileFileName[i]);
                FileUtils.copyFile(item, temp);
            }
        }
        return SUCCESS;
    }
}
Sturts.XML文件和单个文件上传的一样。这样就可以通过Struts2上传文件了。
Struts2文件的上传和下载实现的更多相关文章
- Struts2 -  文件的上传和下载
		1. 前言 这个章节是Struts2框架应用最广泛的三个版块(上传下载.国际化.校验输入)之一,所以这一版块的学习还蛮重要的. 2. 具体内容 回到顶部 2.1Struts2文件上传 2.1.1单 ... 
- Struts2 文件的上传与下载
		1. Struts2的文件上传需要Apache的commons-io-Version.jar和commons-fileupload-Version.jar两个jar包.2. 页面中的<s:fil ... 
- java实现文件的上传和下载
		1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ... 
- JSP文件的上传和下载
		文件上传下载,与传统的方式不同,这里能够上传和下载10G以上的文件.而且支持断点续传. 通常情况下,我们在网站上面下载的时候都是单个文件下载,但是在实际的业务场景中,我们经常会遇到客户需要批量下载的场 ... 
- java实现ftp文件的上传与下载
		最近在做ftp文件的上传与下载,基于此,整理了一下资料.本来想采用java自带的方法,可是看了一下jdk1.6与1.7的实现方法有点区别,于是采用了Apache下的框架实现的... 1.首先引用3个包 ... 
- 在SpringMVC框架下实现文件的  上传和  下载
		在eclipse中的javaEE环境下:导入必要的架包 web.xml的配置文件: <?xml version="1.0" encoding="UTF-8" ... 
- SecureCRT使用sz和rz命令进行文件的上传和下载
		SecureCRT可以使用sz和rz命令进行文件的上传和下载. sz文件下载: 格式:sz 文件名称 即可将服务器的文件下载至本地. rz文件上传: 格式:rz 文件名称 即可将本地文件上传至服务器. ... 
- 使用FTPClient进行文件服务器内文件的上传和下载
		我用的FTPClient是由Apache组织的commons-net.jar包中的API,这个包用起来非常的方便,很容易上手.我在项目开发的过程中主要用到了文件的上传和下载功能,下面将我开发的代码贴出 ... 
- iOS开发中文件的上传和下载功能的基本实现-备用
		感谢大神分享 这篇文章主要介绍了iOS开发中文件的上传和下载功能的基本实现,并且下载方面讲到了大文件的多线程断点下载,需要的朋友可以参考下 文件的上传 说明:文件上传使用的时POST请求,通常把要上传 ... 
随机推荐
- golang 项目实战简明指南
			原文地址 开发环境搭建 golang 的开发环境搭建比较简单,由于是编译型语言,写好 golang 源码后,只需要执行 go build 就能将源码编译成对应平台(本文中默认为 linux)上的可执行 ... 
- mybatsi中文乱码问题
			乱码问题:待总结,这里先贴出网友的博客: http://blog.csdn.net/zht666/article/details/8955952 
- 20155226 实验四 Android开发基础
			20155226第四次实验报告 一.实验内容及步骤 Android Stuidio的安装测试: 安装 Android Stuidio 完成Hello World, 要求修改res目录中的内容,Hell ... 
- 20155317 2016-2017-2 《Java程序设计》实验一 Java开发环境的熟悉
			20155317 2016-2017-2 <Java程序设计>实验一 Java开发环境的熟悉 实验内容 使用JDK编译.运行简单的Java程序: 使用IDEA 编辑.编译.运行.调试Jav ... 
- KVM克隆CentOS6虚拟机后无法启动
			启动网卡报如下错误: Bringing up interface eth0: Device eth0 does not seem to be present,delaying initializati ... 
- Retinex图像增强和暗通道去雾的关系及其在hdr色调恢复上的应用
			很多人都认为retinex和暗通道去雾是八杆子都打不着的增强算法.的确,二者的理论.计算方法都完全迥异,本人直接从二者的公式入手来简单说明一下,有些部分全凭臆想,不对之处大家一起讨论. 首先,为描述方 ... 
- 配置文件语言之yaml
			一. Yaml YAML 是一种简洁的非标记语言.YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读. 由于实现简单,解析成本很低,YAML特别适合在脚本语言中使用.列一下现 ... 
- 排查GCC 4.4.X版本优化switch-enum的BUG
			起因 一次偶然碰到一个诡异的bug,现象是同一份C++代码使用GCC4.4.x版本在开启优化前和优化后的结果不一样,优化后的代码逻辑不正确. 示例代码如下: //main.cpp #include & ... 
- 亚马逊AWS业务副总裁:如何在基础设施上降成本
			腾讯科技 林靖东 11月17日编译 亚马逊Amazon Web Services业务的副总裁.著名工程师詹姆斯汉密尔顿(James Hamilton)在AWS re:Invent大会上解释了公司是如何 ... 
- Oracle 11g用exp无法导出空表的处理方法
			Oracle 11G在用EXPORT导出时,空表不能导出. 11G中有个新特性,当表无数据时,不分配segment,以节省空间 解决方法: 1.insert一行,再rollback就产生segment ... 
