Struts2实现文件的上传与动态下载功能。
本篇主要使用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"> 文 件:<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实现文件的上传与动态下载功能。的更多相关文章
- 使用Struts2实现文件的上传和下载
(一)单个文件的上传步骤: 1.拷贝jar包:commons-fileupload.jar, commons-io.jar 下载链接(文件上传.rar):http://www.cnblogs.com ...
- 基于struts2框架文件的上传与下载
在开发一些社交网站时,需要有允许用户上传自己本地文件的功能,则需要文件的上传下载代码. 首先考虑的是文件的储存位置,这里不考虑存在数据库,因为通过数据库查询获取十分消耗资源与时间,故需将数据存储在服务 ...
- JSP如何实现文件断点上传和断点下载?
核心原理: 该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开 ...
- Struts2——(8)struts2中文件的上传
通过2种方式模拟单个文件上传,效果如下所示 开发步骤如下: 1.新建一个web工程,导入struts2上传文件所需jar,如下图 目录结构 2.新建Action 第一种方式 ...
- Struts2中文件的上传与下载
文件上传 1.jsp页面 <s:form action="fileAction" namespace="/file" method="POST& ...
- struts2实现文件的上传和下载实例[转]
实现原理 Struts 2是通过Commons FileUpload文件上传. Commons FileUpload通过将HTTP的数据保存到临时文件夹,然后Struts使用fileUpload拦截器 ...
- Struts2控制文件的上传与下载
Struts2控制文件上传与下载的几个注意事项: (1)必须将表单的method设置为post,将enctype设置为multipart/from-data.只有这样,浏览器才会把用户选择文件的二进制 ...
- xml文件加密上传和sftp下载解密基本思路
AES对称加密效率高,对大文件加密适合.RSA非对称加密效率低,更安全,对小文件加密适合. 整理 11:12 2016/8/4 加密:1.xml xml.md5摘要 2.(xml)aes加密 (xml ...
- java实现文件的上传和下载
1. servlet 如何实现文件的上传和下载? 1.1上传文件 参考自:http://blog.csdn.net/hzc543806053/article/details/7524491 通过前台选 ...
随机推荐
- 长沙理工校赛I题题解-连续区间的最大公约数
题目来源https://www.nowcoder.com/acm/contest/96/I 解题前们需要先知道几个结论: 首先,gcd是有区单调性的: gcd(L,R)>=gcd(L,R+d) ...
- 開關(switch)規格中,SPDT, DPDT, 3PDT, 4PDT是什麼意思?
Reference http://blog.xuite.net/auster.lai/twblog/433393966 開關(switch)用來控制電路的開與閉,機械式的switc內部是由接點開關.彈 ...
- cobbler一键部署centos7.4(脚本)
执行脚本之前你需要做四件事 1. 关闭防火墙 2.关闭selinux 3.配置163或者阿里云的 yum源 4.上传centos7.4的镜像如下图 [root@cobbler ~]# cat auto ...
- mysql 更新数据
set @num= 1000;update table set a= @num:=@num+1; set @date=now();UPDATE Orders t SET t.CreateTime = ...
- android实现多条件筛选列表菜单筛选菜单
封装组合控件实现一个简单的多条件筛选菜单,可根据自己需求定制筛选条件,动态添加筛选项,灵活使用. 控件封装,点击切换,使用popupWindow实现下拉列表,项目中封装了多种数组数据排序处理方法的工具 ...
- PHP中的stristr(),strstr(),strpos()速度比较
测速代码: <?php function getmicrotime() { list($usec, $sec) = explode(" ",microtime()); ret ...
- HRBUST 1211 火车上的人数【数论解方程/模拟之枚举+递推】
火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起(包括第3站 ...
- 笔记-迎难而上之Java基础进阶8
函数式接口 函数式接口:有且只有一个抽象方法的接口,(可以包含其他默认,静态,私有方法) //函数式接口的使用,创建一个函数式接口 public interface FunctionalInterfa ...
- ubuntu 配置L2tp出现的问题解决
运行环境:ubuntu 14.04 64位 配置推荐网址: https://linux.cn/article-3409-1.html 首先,官方教程是必须的: https://help.ubuntu. ...
- Dedecms文章内容页和图片集内容页,调用缩略图的方法
文章内容页缩略图的调用,图片集内容页缩略图的调用,相信大家都想找这个,对于初学者来说,一大福音> 文章内容页和图片集内容页,缩略图的调用.适合内页中调用. 1 <img src=" ...