zoukankan      html  css  js  c++  java
  • 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>    //写到这里,文件上传这块儿就完成了。
                   由于篇幅问题,这个文件上传就写到这里吧。
  • 相关阅读:
    Bean
    DI
    require import export
    JSON转js
    vue路由相关
    JS引号区别
    Go语言系列之标准库strconv
    Go语言系列之标准库flag
    Go语言系列之并发编程
    Go语言系列之自定义实现日志库
  • 原文地址:https://www.cnblogs.com/siashan/p/4050379.html
Copyright © 2011-2022 走看看