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" >
     文&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>    //写到这里,文件上传这块儿就完成了。
                由于篇幅问题,这个文件上传就写到这里吧。

转载于:https://www.cnblogs.com/siashan/p/4050379.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值