当前位置: 首页 > news >正文

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上传文件了。

转载于:https://www.cnblogs.com/claricre/p/6591958.html

相关文章:

  • java文件的I/O
  • nginx服务与nfs服务
  • JavaScript_9_循环
  • 在Windows下为PHP5.6安装redis扩展和memcached扩展
  • 源码0603-08-掌握-NSURLSession-上传
  • MapReduce实例——查询缺失扑克牌
  • list内变量排序
  • 【bzoj1507】 JSOI2008—Blue Mary的旅行
  • JZOJ 3.25 1420——【汕头市选2012初中组】求和(sum)
  • 报表reportviewer控件使用时,单行文本过长的解决办法
  • 【VB超简单入门】五、基本输出输入
  • WordPress基础知识:条件判断标签及用法大全
  • EF Code-First 学习之旅 Code First Conventions
  • Excel从零整理
  • 线段树建图
  • python3.6+scrapy+mysql 爬虫实战
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 4. 路由到控制器 - Laravel从零开始教程
  • Angular2开发踩坑系列-生产环境编译
  • C++类的相互关联
  • Java超时控制的实现
  • Java多线程(4):使用线程池执行定时任务
  • jquery ajax学习笔记
  • JS数组方法汇总
  • js正则,这点儿就够用了
  • SAP云平台里Global Account和Sub Account的关系
  • 从输入URL到页面加载发生了什么
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 七牛云假注销小指南
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 三分钟教你同步 Visual Studio Code 设置
  • 我有几个粽子,和一个故事
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • FaaS 的简单实践
  • (1)Android开发优化---------UI优化
  • (39)STM32——FLASH闪存
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (ros//EnvironmentVariables)ros环境变量
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (二)Linux——Linux常用指令
  • (十一)手动添加用户和文件的特殊权限
  • (四) 虚拟摄像头vivi体验
  • (原)Matlab的svmtrain和svmclassify
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)原始图像数据和PDF中的图像数据
  • ./configure,make,make install的作用
  • .gitignore文件---让git自动忽略指定文件
  • .mysql secret在哪_MySQL如何使用索引
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • .NET性能优化(文摘)
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • [Angularjs]asp.net mvc+angularjs+web api单页应用之CRUD操作
  • [bzoj 3124][sdoi 2013 省选] 直径