使用 struts2 和 Ajax 下载文件时如何放置进度条

How to put progress bar when downloading file using struts2 and Ajax

我无法放置进度条,因为它直接重定向页面并下载文件。

这么多问题(其中大部分是隐含的)在一个问题中!

How to put progress bar when downloading file using struts2 and Ajax

  1. 如无必要请不要使用AJAX下载。当您在浏览器 (contentDisposition: inline) 中打开文件时,只需使用一个新的 Tab(/Window)。下载文件(contentDisposition: attachment)时,当前页面不会受到影响。您可以在 this answer 中找到几种方法,例如:

    <s:url action="downloadAction.action" var="url">
        <s:param name="param1">value1</s:param>
    </s:url>
    <s:a href="%{url}" >download</s:a>
    

how can we put browser progress bar?

  1. 每个浏览器都有一个在下载文件时显示的内置进度条:

    只有在未提供下载文件长度的情况下,浏览器才能绘制进度条。要指示浏览器,您可以使用 contentLength header,它也可以直接在 Stream 结果中使用:

    <result name="success" type="stream">    
        <param name="contentType">image/jpeg</param>
        <param name="contentDisposition">attachment;filename="document.pdf"</param>
        <param name="contentLength">${lengthOfMyFile}</param>
    </result>
    
    private long lengthOfMyFile; // with Getter
    
    public String execute(){
        /* file loading and stuff ... */
        lengthOfMyFile = myFile.length();
        return SUCCESS;
    }
    

Suppose if file is too heavy. So it take time so I want to prevent user not click to other button

  1. 如果您想要节省带宽,那么您需要处理您的Web 服务器 配置。这篇文章可能会有所帮助:

    如果您不关心防止泛洪请求,而只是防止客户端的多个并发下载,您可以使用 session 变量,放在开始并在方法结束时删除,在下载操作开始时检查它是否存在。存在则不下载,否则:

    // The Action must implement the SessionAware interface
    
    private Map<String,Object> session; // with Setter
    private final static String BUSY = "I'm busy. Try again";
    
    public String execute(){
        if (session.get(BUSY)!=null){
           LOG.debug("Another download is in progress. I stop here");
           return NONE;
        }
        try {
            session.put(BUSY,BUSY);
            /* file loading and stuff ... */
        } finally {
            session.remove(BUSY);
            return SUCCESS;
        }
    }
    

    好的老信号量。