struts 實現文件上傳與下載

struts 實現文件上傳與下載

/*******************************************************************************
 * 文件名: FileUploadAction.java <br>
 * 版本: <br>
 * 描述: 一個文件上傳,下載的Action,繼承於BaseAcion <br>
 * 版權所有: <br>
 * //////////////////////////////////////////////////////// <br>
 * 創建者: 趙志強 <br>
 * 創建日期: 2005-10-28 <br>
 * 修改者: 趙志強 <br>
 * 修改日期: 2005-11-3 <br>
 * 修改說明: 添加gotoUpload方法,用戶通過此方法跳轉到upload.vm <br>
 ******************************************************************************/
package com.css.action;

import java.io.FileInputStream;
import java.io.InputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.BufferedOutputStream;
import java.io.BufferedInputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.List;
import java.util.ArrayList;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.*;
import org.apache.struts.validator.DynaValidatorForm;

import com.css.bean.FileInfoDTO;
import com.css.dao.DAOFactory;
import com.css.dao.FileInfoDAO;
import com.css.exception.BaseException;
import com.css.util.db.DBConfig;
import com.css.bean.UserDTO;

/**
 * @author WANG
 *
 * Java - 代碼樣式 - 代碼模板
 */
public class FileUploadAction extends BaseAction {

    public ActionForward fileUpload(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws BaseException {

        //將字符統一爲gb2312
        /*
         * String encoding = request.getCharacterEncoding(); if ((encoding !=
         * null) && (encoding.equalsIgnoreCase("utf-8"))) {
         * //如果沒有指定編碼,編碼格式爲gb2312 response.setCon*("text/html; charset=gb2312"); }
         */

        //取得DynaValidatorForm的值,通過theFile.get("FileUploadForm")取得上傳的文件
        DynaValidatorForm fileUploadForm = (DynaValidatorForm) form;
        FormFile file = null;
        file = (FormFile) fileUploadForm.get("theFile");
        String describe = fileUploadForm.getString("describe");
        String permit = fileUploadForm.getString("permit");

        //設置用戶權限不足時出現的錯誤,用戶將跳轉到download.vm--FileUpload.do?act=showFile
        UserDTO userDTO = getSessionObj(request);
        if (userDTO == null) {
            this.setSysMessage(request, "login.failAdmin", "btn.readmin",
                    "FileUpload.do?act=showFile");
            return mapping.findForward("error");
        }
       
        //獲取FormFile的實例fileName中的兩個屬性
        String fileName = file.getFileName();//取得文件名
       
        //測試該文件是不是合法
        if(!isValidFile(fileName))
        {
            this.setSysMessage(request, "upload.badtype", "btn.reupload",
            "FileUpload.do?act=gotoUpload");
            return mapping.findForward("error");
        }
        int fileSize = file.getFileSize();//取得文件尺寸

        //通過getInputStream()方法取得文件流
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        InputStream is = null;
        OutputStream fos = null;

        try {
            is = (InputStream) file.getInputStream();//把文件讀入
            bis = new BufferedInputStream(is);
            String filePath = getUploadDir();//取當前系統路徑
            fos = new FileOutputStream(filePath + fileName);//建立一個上傳文件的輸出流
            bos = new BufferedOutputStream(fos);
            //System.out.println(filePath + fileName);

            //文件最大限額
            int fileMaxSize = 10 * 1024 * 1024;

            if (fileSize > fileMaxSize) {
                //文件大小不能超過fileMaxSize,如果超過,報"上傳文件尺寸超過10M"錯誤;
                this.setSysMessage(request, "upload.max", "btn.reupload",
                        "FileUpload.do?act=gotoUpload");
                return mapping.findForward("error");
            }
            int bytesRead = 0;
            byte[] buffer = new byte[5 * 1024];
            while ((bytesRead = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);//將文件寫入服務器
            }
        }
        catch (IOException e) {
            //設置文件物理上傳出現問題時的出現的錯誤信息
            this.setSysMessage(request, "upload.failed", "btn.reupload",
                    "FileUpload.do?act=gotoUpload");
            return mapping.findForward("error");
        }
        finally {
            if (bos != null) {

                try {
                    bos.close();
                }
                catch (IOException e) {
                    System.err.print(e);
                }
            }
            if (bis != null) {
                try {
                    bis.close();
                }
                catch (IOException e) {
                    System.err.print(e);
                }
            }

        }
        //文件物理上傳完成
        //將文件信息添加到數據庫
        //填充FileInfoDTO
        FileInfoDTO dto = new FileInfoDTO();
        dto.setCheckType("1");
        dto.setDescribe(describe);
        dto.setFileName(fileName);
        dto.setFileSize(String.valueOf(fileSize));
        dto.setIsUse("0");
        dto.setPermit(permit);
        dto.setUserID(userDTO.getUserId());

        FileInfoDAO fileinfoDAO = (FileInfoDAO) DAOFactory.getDAOFactory(
                DBConfig.getDataBaseName()).getFileInfoDAO();
        int result = fileinfoDAO.insert(dto);
        //request.setAttribute("dat",file.getFileName());
        if (result > 0) {
            return mapping.findForward("gotoUpload");
        }
        else {
            //設置文件寫入數據庫時出現的信息
            this.setSysMessage(request, "upload.failed", "btn.reupload",
                    "FileUpload.do?act=gotoUpload");
            return mapping.findForward("error");
        }
    }

    public ActionForward fileDownLoad(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws BaseException {
        /*
         * 取得文件:文件id+文件路徑+文件名+流 文件id=通過formbean取得 文件路徑=通過取得配置文件的方法得到
         * 文件名稱=通過數據庫得到 流=io
         */
        //取得文件路徑,也就是保存文件的文件夾名稱
        String fileID = null;//文件id
        String filePath = null;//方法取得路徑
        String fileName = null;//名稱
        String permit = null; //權限,用來作身份驗證

        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;
        OutputStream fos = null;
        InputStream fis = null;

        //        DynaValidatorForm fileUploadForm = (DynaValidatorForm) form;
        //        fileID = fileUploadForm.getString("fileID");//得到文件id
        fileID = request.getParameter("fileID");
        filePath = getUploadDir();
        FileInfoDAO fileinfoDAO = (FileInfoDAO) DAOFactory.getDAOFactory(
                DBConfig.getDataBaseName()).getFileInfoDAO();

       
        FileInfoDTO fileInfoDTO = fileinfoDAO.findByPK(fileID);
        if(fileInfoDTO == null)
        {
            this.setSysMessage(request, "download.failed", "btn.redownload",
            "FileUpload.do?act=showFile");
            return mapping.findForward("error");
        }
        fileName = fileInfoDTO.getFileName();
        permit = fileInfoDTO.getPermit();
       
        //身份驗證
        UserDTO userDTO = this.getSessionObj(request);
        if(userDTO == null)
        {
            this.setSysMessage(request, "login.failAdmin", "btn.redownload",
            "FileUpload.do?act=showFile");
            return mapping.findForward("error");
        }
        else if(!userDTO.getUserType().equals(fileInfoDTO.getPermit()))
        {
            this.setSysMessage(request, "login.failAdmin", "btn.redownload",
            "FileUpload.do?act=showFile");
            return mapping.findForward("error");
        }
        if (fileName == null) {
            //設置查找數據時出現的錯誤信息
            this.setSysMessage(request, "download.failed", "btn.redownload",
                    "FileUpload.do?act=showFile");
            return mapping.findForward("error");
        }

        try {
            response.setContentType(this.getContentType(fileName));
            response.setHeader("Content-disposition", "attachment;filename="
                    + URLEncoder.encode(fileName, "utf-8"));
            fis = new FileInputStream(filePath + fileName);
            bis = new BufferedInputStream(fis);
            fos = response.getOutputStream();
            bos = new BufferedOutputStream(fos);

            int bytesRead = 0;
            byte[] buffer = new byte[5 * 1024];
            while ((bytesRead = bis.read(buffer)) != -1) {
                bos.write(buffer, 0, bytesRead);//將文件發送到客戶端
            }
        }
        catch (IOException e) {
//            response.setContentType("text/html");
            response.reset();
            //設置文件物理下載時出現的錯誤信息
            this.setSysMessage(request, "download.failed", "btn.reupload",
                    "FileUpload.do?act=showFile");
            return mapping.findForward("error");
        }
        finally {
            try {
                if (fos != null) {
                    fos.close();
                }
                if (bos != null) {
                    bos.close();
                }
                if (fis != null) {
                    fis.close();
                }
                if (bis != null) {
                    bis.close();
                }
            }
            catch (IOException e) {

                System.err.print(e);
            }
        }

        return null;
    }

    public ActionForward showFile(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws BaseException {
        /*
         * 用戶下載的方法, 用戶可以看到和下載和自己權限一樣的文件和所有遊客權限的文件
         */
        UserDTO userDTO = getSessionObj(request);
        boolean isLogin = true;
        boolean isCheck = false;
        String userType = null;
        if (userDTO == null) {
            isLogin = false;
        }
        else {
            if (userDTO.getIsCheck().equals("1")) {
                isCheck = true;
            }
        }
        /*
         * 獲取權限後, 連接數據庫, 查找權限爲permit,以及4(遊客權限)的所有權限, 並生成List對象通過request發送給客戶.
         */

        //連接數據庫
        FileInfoDAO fileinfoDAO = (FileInfoDAO) DAOFactory.getDAOFactory(
                DBConfig.getDataBaseName()).getFileInfoDAO();

        //查找並將數據保存在List對象中.

        List list = new ArrayList();
        //從FILEINFO表和USERS表中查找需要的數據存放在每一個FileInfoDTO中.

        //判斷用戶的權限:isCheck=ture=審覈人員,isLogin=內部用戶或者外部用戶,客戶。其他爲遊客。
        if (isCheck) {
            list = fileinfoDAO.findAll();
        }
        else {
            if(isLogin)
            {
                userType = userDTO.getUserType();
                list = fileinfoDAO.findAll(userType, isLogin);
            }
            else
            {
                userType = "4";
                list = fileinfoDAO.findAll(userType, isLogin);
            }
        }
        //將數據保存在request中
        request.setAttribute("fileList", list);
        request.setAttribute("userDTO", userDTO);
        return mapping.findForward("fileDownload");
    }

    public ActionForward gotoUpload(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws BaseException {
        //用戶通過此方法跳轉到upload.vm
        UserDTO userDTO = getSessionObj(request);
        if (userDTO == null) {
            //設置用戶權限不足時出現的錯誤,用戶將跳轉到download.vm--FileUpload.do?act=showFile
            this.setSysMessage(request, "login.failAdmin", "btn.redownload",
                    "FileUpload.do?act=showFile");
            return mapping.findForward("error");
        }

        return mapping.findForward("fileUpload");
    }

    private boolean isValidFile(String fileName) {
        String[] validFiles = { "txt", "gif", "jpg", "jpeg", "jpe", "zip",
                "rar", "doc", "ppt", "xls", "html", "htm", "tif", "tiff", "pdf" };
        boolean ret = false;
        for (int i = 0; i < validFiles.length; i++) {
            if (fileName.toLowerCase().endsWith(validFiles[i])) {
                ret = true;
                break;
            }
        }
        return ret;
    }

    private String getContentType(String fileName) {
        String fileNameTmp = fileName.toLowerCase();
        String ret = "";
        if (fileNameTmp.endsWith("txt")) {
            ret = "text/plain";
        }
        if (fileNameTmp.endsWith("gif")) {
            ret = "image/gif";
        }
        if (fileNameTmp.endsWith("jpg")) {
            ret = "image/jpeg";
        }
        if (fileNameTmp.endsWith("jpeg")) {
            ret = "image/jpeg";
        }
        if (fileNameTmp.endsWith("jpe")) {
            ret = "image/jpeg";
        }
        if (fileNameTmp.endsWith("zip")) {
            ret = "application/zip";
        }
        if (fileNameTmp.endsWith("rar")) {
            ret = "application/rar";
        }
        if (fileNameTmp.endsWith("doc")) {
            ret = "application/msword";
        }
        if (fileNameTmp.endsWith("ppt")) {
            ret = "application/vnd.ms-powerpoint";
        }
        if (fileNameTmp.endsWith("xls")) {
            ret = "application/vnd.ms-excel";
        }
        if (fileNameTmp.endsWith("html")) {
            ret = "text/html";
        }
        if (fileNameTmp.endsWith("htm")) {
            ret = "text/html";
        }
        if (fileNameTmp.endsWith("tif")) {
            ret = "image/tiff";
        }
        if (fileNameTmp.endsWith("tiff")) {
            ret = "image/tiff";
        }
        if (fileNameTmp.endsWith("pdf")) {
            ret = "application/pdf";
        }
        return ret;
    }
}

發佈了2 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章