使用Struts2實現文件的上傳與動態下載

fmms 12年前發布 | 65K 次閱讀 Struts2 文件上傳

本篇主要使用Struts2實現文件的上傳與動態下載功能。出于安全考慮,所以,在硬盤上存儲上傳的文件的時候,統一都重新命名為隨機字符串。用數據庫存儲真實文件名與隨機文件名稱之間的關聯。

下面的是實體類

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省略
}

然后寫頁面,頁面其實很簡單:

<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,前面提到過,出于安全考慮,所以,在硬盤上存儲上傳的文件的時候,統一都重新命名為隨機字符串。用數據庫存儲真實文件名與隨機文件名稱之間的關聯。

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的配置

struts.multipart.saveDir=D\:\\    設定臨時文件存儲位置
struts.multipart.maxSize=105591603200     //設置文件最大上傳多少兆,這里單位是字節

Struts.xml中對Action的配置

<!-- 文件上傳 -->
<action name="fileUploadAction" class="com.action.FileUploadAction">
  <result name="success">/file/fileupload.jsp</result>

  <result name="input">/file/fileupload.jsp</result>
</action>    //寫到這里,文件上傳這塊兒就完成了。
               由于篇幅問題,這個文件上傳就寫到這里吧。

 本文由用戶 fmms 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!