页面打包下载功能(包括页面上带的附件)

基础篇 专栏收录该内容
19 篇文章 0 订阅


  1. 需求描述

用户浏览页面查看信息,点击按钮下载页面内容并包括页面所带附件的插件打包效果图如下:
这里写图片描述
这里特别说一下,下载的页面与原页面是一样的。(包含页面的样式也一并下载)
  
  2. 代码展示
  要想把页面下载打包首先要把整个页面的内容包括样式图片下载到临时文件,但是页面的内容怎么传到后台?说一下思路,先把页面拼接成字符串(包括样式)。然后创建iframe,把拼接好的页面塞在里面。再通过下载iframe下载页面。请看代码:
js代码
/**
 * 共享资源查看下载
 */
var lm = _extMask('databox', '数据加载中,请稍候……');
var lmf = _extMask('databox', '正在生成压缩文件,请稍候……');
// 是否进行下载
var flagZip = false;
var titles='';
/**
 * 下载压缩文件
 */
function zipDownload1() {

    if (flagZip) {
        flagZip = false;
    } else {
        return;
    }

    // 准备好HTML
    // _createHtml(title);
    // $("#TEMP_FILE_NAME").val(new Date());

    var url = "/acws.file_download?class=com.huaxin.gxgc.service.balanceaudit.ZipDownloadService";
    url = url + "&para=";
    url = url + "BUSINESSOBJ_TYPE|XMYS";// +pmfiletypelist["678"];
    url = url + "*ZIP_TYPE|5";
    url = url + "*BUSINESSOBJ_ID|" + appId;
    url = url + "*TEMPHTMLPREV|" + htmlFilePrevName;
    lmf.show();

    document.getElementById("fileDownIFrame").src = url;

    var iframeDown = document.all.fileDownIFrame;
    iframeDown.attachEvent("onreadystatechange", function() {
        // 利用状态 判断是否完成ZIP文件处理
        lmf.hide();

        if (iframeDown.readyState === "complete" || iframeDown.readyState == "loaded") {

        }
    });
    setTimeout(function() {
        lmf.hide();
    }, 10000);

}

var htmlFilePrevName = "";// 临时HTML文件的名称
/**
 * 保存HTML
 */
function zipDownload(title) {
    if ($("#htmlCreateIFrame").length == 0) {
        $(document.body).append('<iframe src="about:blank" id="htmlCreateIFrame" style="display: none"></iframe>');
    }

    htmlFilePrevName = Math.round(Math.random() * 10000000000);
    titles=$("#BEST_CASE_TITLE").html();
    if(titles=='' || titles==null){
        titles=$("#PROBLEM_TITLE").val();
    }
    _createHtml(titles, $("#databox").html(), true);

    document.all.htmlCreateIFrame.src = '/projectweb/pages/common/htmlcreate.html';

    setIframeComplete('htmlCreateIFrame');

    // 设置可以下载压缩文件
    flagZip = true;
}

/**
 * 生成html
 */
var htmlCreateContent; // html的内容
var htmlCreateTitle; // html的内容
function _createHtml(title, contentHtml, flag) {


    var bodyHtml = contentHtml;
    htmlCreateContent = '<html><head><title>' + title + '</title><meta http-equiv="Content-Type" content="text/html; charset=GBK">' + '</head>' + htmlCss() + '<body style="width: 100%;">' + bodyHtml
            + '</body></html>';
    htmlCreateTitle = title;


}

/**
 * 定时扫描iframe是否加载完成
 */
function setIframeComplete(iframeName) {
    try {
        if (window.frames[iframeName].document.readyState == "complete" && window.frames['webWordView'].document.readyState == "complete") {
            // 开始生成压缩文件
            validateHtmlFile();
            window.frames[iframeName].doSubmit1(tmlCreateContent, htmlCreateTitle, htmlFilePrevName, "ZIP_DOWN");
        } else {
            setTimeout(function() {
                setIframeComplete('htmlCreateIFrame');
            }, 500);
        }
    } catch (err) {
        if (window.frames[iframeName].document.readyState == "complete") {

            // 开始生成压缩文件
            validateHtmlFile();
            window.frames[iframeName].doSubmit1(htmlCreateContent, htmlCreateTitle, htmlFilePrevName, "ZIP_DOWN");

        } else {
            setTimeout(function() {
                setIframeComplete('htmlCreateIFrame');
            }, 500);
        }
    }
}

/**
 * 判断临时文件是否生成 如果有进行压缩下载
 */
function validateHtmlFile() {
    var inputData = {};
    inputData.HTMLFILEPREVNAME = htmlFilePrevName;
    ACWS.ajax("gxgc/service/balanceaudit/BalanceAudit/ValidateHtmlFile", inputData, function(jso) {
        if (!isNull(jso)) {
            if (jso.EXISTS) {
                zipDownload1();
            } else {
                setTimeout(function() {
                    validateHtmlFile();
                }, 500);
            }
        }
    });
}

判断临时文件是否生成后台处理代码

    /**
     * 检测临时文件是否生成
     * 
     * @param inputData
     * @return
     */
    public HashMap doValidateHtmlFile(HashMap inputData) {
        HashMap outputData = new HashMap();
        outputData.put("EXISTS", false);
        // 生成的临时文件目录
        ZipDownloadService zdService = new ZipDownloadService();
        String sysTempDir = zdService.sysTempPath();// 系统临时文件目录-
        // 临时HTML文件前缀
        String htmlPrevName = MapUtils.getString(inputData, "HTMLFILEPREVNAME", "");
        File fdir[] = new File(sysTempDir).listFiles();
        for (File f : fdir) {
            String fName = f.getName();
            // 临时HTML文件
            if (fName.indexOf(htmlPrevName) > -1) {
                if (f.exists()) {
                    outputData.put("EXISTS", true);
                }
            }
        }
        return outputData;
    }

创建生成页面的模板页面及方法

<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=GBK">
    </head>
    <body>
        <form method="post" name="htmlFrm">
            <input type="hidden" name="htmlContent" id="htmlContent" />
            <input type="hidden" name="title" id="title" />
            <input type="hidden" name="htmlPrevName" id="htmlPrevName" />
            <input type="hidden" name="DOWN_TYPE" id="DOWN_TYPE" />
        </form>
    </body>
</html>
<script language="javascript">
    /**
     * 进行HTML文件下载
     * @param {Object} txt
     * @param {Object} title
     */
    function doSubmit(txt,title){
        document.getElementById("htmlContent").value=txt;
        document.getElementById("title").value=title;
        htmlFrm.action = '/acws.htmlcreate';
        htmlFrm.submit();
    }

    /**
     * 进行提交 <添加htmlFilePrevName参数 为了生成临时文件 不进行下载>
     * @param {Object} txt
     * @param {Object} title
     * @param {Object} htmlFilePrevName
     * @param {Object} downType
     */
    function doSubmit1(txt,title,htmlFilePrevName,downType){
        document.getElementById("htmlContent").value=txt;
        document.getElementById("title").value=title;
        document.getElementById("htmlPrevName").value=htmlFilePrevName;
        document.getElementById("DOWN_TYPE").value=downType;
        htmlFrm.action = '/acws.htmlcreate';
        htmlFrm.submit();
    }
</script>

下载页面内容附件并打包后台处理



/**
 * 附件下载
 * 
 * @author 
 */
public class ZipDownloadService extends BigFileDownLoadBase {

    public File zip = null;// 全局使用
    public String zipFullPath = "";// 全局使用
    public String fileNameFlag = Security.getUserLoginID();// 文件名特殊标示

    public String htmlPrevName = "";// 临时HTML文件的前缀

    public String zipType = "";//

    String title="";

    /**
     * 释放文件流
     */
    public void afterDownload() {
        // InputStream fileInputStream = super.getFileInputStream();
        // if (fileInputStream != null) {
        // try {
        // fileInputStream.close();
        // } catch (Exception e) {
        // }
        // }
        fileNameFlag = Security.getUserLoginID();
        // 删除生成的临时文件
        String sysTempDir = this.sysTempPath();// 系统临时文件目录-
        File fdir[] = new File(sysTempDir).listFiles();
        for (File f : fdir) {
            String fName = f.getName();
            if (fName.indexOf("sys_") > -1 && fName.indexOf("ljs") > -1 && fName.indexOf(fileNameFlag) > -1) {
                if (f.exists()) {
                    f.getAbsoluteFile().delete();
                }
            }
            // 删除临时HTML文件
            if (fName.indexOf(htmlPrevName) > -1) {
                if (f.exists()) {
                    f.getAbsoluteFile().delete();
                }
            }
        }
    }

    /**
     * 取得文件名、文件类型、文件流
     */
    public void beforeDownload() {
        String params[] = super.getPara().split("\\*");
        HashMap mapParams = new HashMap();
        // 参数处理
        for (String ps : params) {
            String pas[] = ps.split("\\|");
            if (pas.length == 2) {
                mapParams.put(pas[0], pas[1]);
            } else if (pas.length == 1) {
                mapParams.put(pas[0], "");
            }
        }

        // 临时HTML文件前缀
        htmlPrevName = MapUtils.getString(mapParams, "TEMPHTMLPREV", "");
        // 功能模块下载ZIP
        zipType = MapUtils.getString(mapParams, "ZIP_TYPE", "");
        //下载类型
        String D_TYPE = MapUtils.getString(mapParams, "D_TYPE", "");
        String appId = MapUtils.getString(mapParams, "BUSINESSOBJ_ID", "");


        //      
        HashMap outputData = new HashMap();
        // 查询类
        BalanceAuditDao baAuditDao = new BalanceAuditDao();

        //ftp获文件
        AttachmentsDownloadService downloadService = new AttachmentsDownloadService();

        // 附件数据
        List recList =new ArrayList();
//      String title="";
        if("5".equals(zipType)){
             ProjectProblemDao projectProblemDao =new ProjectProblemDao();
             recList=projectProblemDao.getBestRecordList(mapParams);
             BoBestCaseDao boBestCaseDao=new BoBestCaseDao();
             title=boBestCaseDao.getName(appId);
        }else{
            recList= baAuditDao.getRecordList(mapParams);
        }
        if (recList == null) {
            recList = new ArrayList();
        }

        String sysTempDir = this.sysTempPath();// 系统临时文件目录-
        File fdir[] = new File(sysTempDir).listFiles();
        for (File f : fdir) {
            String fName = f.getName();
            // 临时HTML文件
            if (fName.indexOf(htmlPrevName) > -1) {
                if (f.exists()) {
                    HashMap tMap = new HashMap();
                    tMap.put("FILE_FULLPATH_", f.getAbsoluteFile().getAbsolutePath());

                    if ("5".equals(zipType)) {
                        tMap.put("FILENAME", ""+title+".html");// f.getName().replace(htmlPrevName,
                        // "")
                    }

                    recList.add(tMap);
                }
            }
        }

        // 要进行压缩的文件
        File filePaths[] = new File[recList.size()];
        String fileNames[] = new String[recList.size()];
        // 
        // String sysTempDir = this.sysTempPath();// 系统临时文件目录-
        int count = 0;
        for (int i = 0; i < recList.size(); i++) {
            InputStream fileInputStream = null;
            HashMap record = (HashMap) recList.get(i);
            // super.setFileType(MapUtils.getString(record, "FILEEXTENSION",
            // ""));
            String fullPath = MapUtils.getString(record, "FILE_FULLPATH_", "");
            //
            String fileName = MapUtils.getString(record, "FILENAME", "");
            File f = null;// 添加de文件

            fileNameFlag = Security.getUserLoginID() + new Date().getTime();

            if (StringUtils.isBlank(fullPath)) {
                fileInputStream = (InputStream) record.get("FILEOBJECT");
                FileOutputStream fos = null;
                try {
                    f = new File(sysTempDir + "sys_single_ljs_" + fileNameFlag + fileName);

                    // 生成输出对象
                    fos = new FileOutputStream(f);
                    if(null != fileInputStream){
                        // 一次读一个字节
                        int tempbyte;
                        while ((tempbyte = fileInputStream.read()) != -1) {
                            fos.write(tempbyte);
                        }
                        fileInputStream.close();
                    }

                } catch (Exception e) {
                    throw new RuntimeException("文件流读写至单个临时文件失败:" + f.getAbsolutePath());
                } finally {
                    try {
                        if (fos != null) {
                            fos.close();
                        }
                        if (fileInputStream != null) {
                            fileInputStream.close();
                        }
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            } else {
                // 文件添加
                f = new File(fullPath);
                if(!f.isFile() || !f.exists()){
                    String downloadFile = fullPath.substring(fullPath.lastIndexOf("/") + 1);
                    //通过ftp下载文件实体
                    downloadService.sftp2WebApp(fullPath);
                    String saveFile = sysTempDir+downloadFile;
                    f = new File(saveFile);
                    if(!f.isFile() || !f.exists()){

                    }
                }
            }
            // 如果文件存在
            if (f.isFile() && f.exists()) {
                filePaths[count] = f;
                fileNames[count] = fileName;
            } else {
                filePaths[count] = null;
                fileNames[count] = null;
            }
            count++;
        }
        if (recList != null && recList.size() > 0) {
            File zip = null;
            if (!new File(sysTempDir).isDirectory()) {
                new File(sysTempDir).mkdir();
            }
            zip = new File(sysTempDir + "sys_down_zip_temp_ljs" + fileNameFlag + ".zip");// 压缩文件
            // 生成文件
            FileZip.file2Zip(filePaths, fileNames, zip);
            zipFullPath = zip.getAbsolutePath();
            // 下载的文件源
            // FileInputStream fileInputStream = new
            // FileInputStream(zip.getAbsolutePath());
        }
        outputData.put("FILE_FULLPATH", zipFullPath);// 路径 暂时无使用
    }

    /**
     * 临时文件目录- 根据系统配置文件取得
     * 
     * @return
     */
    public String sysTempPath() {

        Properties PROPERTIES = null;
        // 工程根目录
        URL url = null;
        url = AcwsGlobalProperties.class.getClassLoader().getResource("acws.properties");
        if (url != null) {
            InputStream is;
            try {
                is = url.openStream();
                PROPERTIES = new java.util.Properties();
                PROPERTIES.load(is);
                is.close();
            } catch (IOException e) {
                // 配置文件读取失败
                // e.printStackTrace();
            }
        }

        if (PROPERTIES.get("acws.filedownload.tempPath") != null) {
            // 系统属性
            Properties properties = System.getProperties();
            String osName = properties.getProperty("os.name");
            String tmppath = PROPERTIES.get("acws.filedownload.tempPath").toString();
            if (osName.indexOf("Windows") != -1) {
                if (!tmppath.endsWith("\\")) {
                    tmppath = tmppath + "\\";
                }
            } else {
                if (!tmppath.endsWith("/")) {
                    tmppath = tmppath + "/";
                }
            }
            return tmppath;
        } else {
            throw new RuntimeException("系统acws.filedownload.tempPath读取失败");
        }
    }

    /**
     * 下载文件名
     */
    @Override
    public String getFileName() {
        if ("1".equals(zipType)) {
            return "AAA.zip";}
        else if ("5".equals(zipType)) {
            return title + ".zip";
        }

        return "AAA.zip";
    }

    /**
     * 临时文件全路径
     */
    @Override
    public String getFilePath() {
        return zipFullPath;
    }

    /**
     * 文件类型
     */
    @Override
    public String getFileType() {
        return "zip";
    }

}
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:编程工作室 设计师:CSDN官方博客 返回首页

打赏作者

qq_35807697

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值