本篇主要使用Struts2实现文件的上传与动态下载功能。出于安全考虑,所以,在硬盘上存储上传的文件的时候,统一都重新命名为随机字符串。用数据库存储真实文件名与随机文件名称之间的关联。

下面的是实体类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class FileBag implements java.io.Serializable {
 
    // Fields
 
    private Integer id;   //Id编号
    private String filePath;  //文件存储路径(真实的文件被重命名后的名称)
    private Date fileIndate;  //文件上传日期
    private Integer downloadCount;  //文件下载次数
    private String fileMark;    //文件备注,说明
    private String fileSize;    //文件大小
    private String fileType;    //文件类型
    private String fileName;    //真实的文件名称
      
     //getter 和setter省略
}

然后写页面,页面其实很简单:

1
2
3
4
5
6
7
8
9
10
11
<form method="post" action="fileUploadAction.action" enctype="multipart/form-data">
 
    <div id="chooser">
    文&nbsp;&nbsp;&nbsp;&nbsp;件:<input id="file" type="file" name="file"/><br/>
 
    文件描述:<textarea id="fileremark" name="fileremark"></textarea><br/>   
    </div>
     
    <input type="submit" value="上传"/>
 
    </form>

然后写Action,前面提到过,出于安全考虑,所以,在硬盘上存储上传的文件的时候,统一都重新命名为随机字符串。用数据库存储真实文件名与随机文件名称之间的关联。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
package com.action;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
 
import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;
 
import com.common.base.BaseAction;
import com.common.util.Configuration;
import com.common.util.FileExtensionHelper;
import com.common.util.StringUtils;
import com.entity.FileBag;
import com.opensymphony.xwork2.ModelDriven;
import com.service.FileBagService;
//该类支持多文件上传
public class FileUploadAction extends BaseAction {
 
    @Autowired
    private FileBagService fileBagService;
     
    private List<File> file;//Struts2文件上传不可缺少
    private List<String> fileFileName;//Struts2文件上传不可缺少
    private List<String> fileContentType;//Struts2文件上传不可缺少
    private List<String> fileremark;
     
    public List<File> getFile() {
        return file;
    }
 
    public void setFile(List<File> file) {
        this.file = file;
    }
 
    public List<String> getFileFileName() {
        return fileFileName;
    }
 
    public void setFileFileName(List<String> fileFileName) {
        this.fileFileName = fileFileName;
    }
 
    public List<String> getFileContentType() {
        return fileContentType;
    }
 
    public void setFileContentType(List<String> fileContentType) {
        this.fileContentType = fileContentType;
    }
 
    /**
     * 执行文件上传的操作,会自动生成一个带随机文件名的字符串来防止重复文件。
     */
    public String execute() throws Exception {
        for (int i = 0; i < file.size(); i++) {         
            FileBag fileBag = new FileBag();   //创建一个新的实例存储文件信息
            fileBag.setFileIndate(new Date());  //设定文件上传日期
            fileBag.setFileMark(fileremark.get(i));   //设定文件的备注信息
            fileBag.setFileName(fileFileName.get(i));  //设定文件的真实名称
            fileBag.setDownloadCount(0);   //设定文件下载次数为0
            fileBag.setFileSize(file.get(i).length()+"");
            String fileRandomName = StringUtils.randomString(20);  //随机产生文件名称的字符串
            fileBag.setFilePath(fileRandomName);        //设定文件的随机名称
            fileBag.setFileType(this.fileContentType.get(i));  //设定文件类型
            InputStream in = new FileInputStream(file.get(i));
            //从Configuration类中获取设定的文件存储路径(常量),下载的时候也会用到这个存储地址
            String root = Configuration.getValue("fileSaveDir");
            File file = new File(root);
            if(!file.exists()){//如果目录不存在,则会重新创建目录
                file.mkdirs();
                System.out.println("重新创建目录!");
            }
            File destFile = new File(root, fileRandomName);
            OutputStream out = new FileOutputStream(destFile);
            byte[] b = new byte[1024];
            int length = 0;
            while ((length = in.read(b)) > 0) {
                out.write(b, 0, length);
            }
            in.close();
            out.close();
            fileBagService.save(fileBag);
        }
        this.msg=this.file.size()+"个文件上传成功!";
        return SUCCESS;
    }
 
    public List<String> getFileremark() {
        return fileremark;
    }
 
    public void setFileremark(List<String> fileremark) {
        this.fileremark = fileremark;
    }
 
}

设定Struts2的配置

1
2
struts.multipart.saveDir=D\:\\    设定临时文件存储位置
struts.multipart.maxSize=105591603200     //设置文件最大上传多少兆,这里单位是字节

Struts.xml中对Action的配置

1
2
3
4
5
6
7
<!-- 文件上传 -->
<action name="fileUploadAction" class="com.action.FileUploadAction">
  <result name="success">/file/fileupload.jsp</result>
 
  <result name="input">/file/fileupload.jsp</result>
</action>    //写到这里,文件上传这块儿就完成了。
               由于篇幅问题,这个文件上传就写到这里吧。

Struts2实现文件的上传与动态下载功能。的更多相关文章

  1. 使用Struts2实现文件的上传和下载

    (一)单个文件的上传步骤: 1.拷贝jar包:commons-fileupload.jar,  commons-io.jar 下载链接(文件上传.rar):http://www.cnblogs.com ...

  2. 基于struts2框架文件的上传与下载

    在开发一些社交网站时,需要有允许用户上传自己本地文件的功能,则需要文件的上传下载代码. 首先考虑的是文件的储存位置,这里不考虑存在数据库,因为通过数据库查询获取十分消耗资源与时间,故需将数据存储在服务 ...

  3. JSP如何实现文件断点上传和断点下载?

    核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...

  4. Struts2——(8)struts2中文件的上传

    通过2种方式模拟单个文件上传,效果如下所示 开发步骤如下: 1.新建一个web工程,导入struts2上传文件所需jar,如下图 目录结构              2.新建Action  第一种方式 ...

  5. Struts2中文件的上传与下载

    文件上传 1.jsp页面 <s:form action="fileAction" namespace="/file" method="POST& ...

  6. struts2实现文件的上传和下载实例[转]

    实现原理 Struts 2是通过Commons FileUpload文件上传. Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器 ...

  7. Struts2控制文件的上传与下载

    Struts2控制文件上传与下载的几个注意事项: (1)必须将表单的method设置为post,将enctype设置为multipart/from-data.只有这样,浏览器才会把用户选择文件的二进制 ...

  8. xml文件加密上传和sftp下载解密基本思路

    AES对称加密效率高,对大文件加密适合.RSA非对称加密效率低,更安全,对小文件加密适合. 整理 11:12 2016/8/4 加密:1.xml xml.md5摘要 2.(xml)aes加密 (xml ...

  9. java实现文件的上传和下载

    1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...

随机推荐

  1. Python之访问set

    dict的作用是建立一组 key 和一组 value 的映射关系,dict的key是不能重复的. 有的时候,我们只想要 dict 的 key,不关心 key 对应的 value,目的就是保证这个集合的 ...

  2. 【CF1015F】Bracket Substring(字符串DP)

    题意:给定一个只由左右括号组成的字符串s,问长度为2*n的包含它的合法括号序列方案数,答案对1e9+7取模 1≤n≤100,1≤|s|≤200 思路:暴力预处理出s的每个前缀[0..i]后加左右括号分 ...

  3. C#可选参数与具名参数

    可选参数 static void test1() { func1("A"); func1(); Console.ReadKey(); } ) { Console.WriteLine ...

  4. Lawnmower(洛谷 CF115B)

    题目看这里 题目大意 简单来讲就是从(1,1)向左或右或下走,经过所有草坪的最短路程 思路: 由于在第一行只能向右走,那么我们就知道,在单数行和双数行分别是向右走和向左走,那么我们在单数行就只需要统计 ...

  5. PyCharm 快捷键总结

    运行 Shift+alt+F10 执行程序 调试 Shift+alt+F9 Debug调试 Shift + F9 对当前文件进行Debug F8 调试模式下 跳过 F7 调试模式下 进入 F9 快速调 ...

  6. Unity工程资源破解

        Unity工程资源提取其实还是很方便的,网上也有很多相关介绍,比如雨凇就专门写了一遍关于破解Unity资源的文章(http://www.xuanyusong.com/archives/3618 ...

  7. python中mp3转wav(Couldn't find ffmpeg or avconv - defaulting to ffmpeg, but may not work")

    1.下载pydub:pip install pydub 2.下载与操作系统一致的ffmpeg:http://ffmpeg.org/download.html 3.解压后将下载的ffmpeg下的bin目 ...

  8. vs2013载入zlib库,即include "zlib.h"

    转自wo13142yanyouxin原文vs2013载入zlib库,即include "zlib.h" 在程序中,我们经常要用到压缩,解压函数.以压缩函数compress为例进行说 ...

  9. mac使用xampp中自带phpmyadmin连接单独安装mysql

    1 在xampp安装目录中找到phpadmin目录,编辑config.inc.php权限,赋予读写权限 2 打开config.inc.php $cfg['Servers'][$i]['user'] = ...

  10. SilverLight-DataConversion: 银光数据转换

    ylbtech-SilverLight-DataConversion: 银光数据转换 1.A, Silverlight字符串格式表 1.B, 价格格式转换器 1.C, 日期时间格式转换器 1.D, 图 ...