检查来自HttpServletResponse的流是否是由客户端下载的 - JAVA

时间:2016-01-05 20:52:52

标签: java apache http tomcat struts2

基本上,我的系统生成url来从我的服务器下载文件。我使用Struts创建了这个类型' stream'的结果。这项工作很棒。 现在我想注意下载的每个文件,如果已经完全下载了。

我一直在寻找,但我真的不知道如何继续。我是初学者。

**

新动作:

**

  public String download(){
  try {
            String path = Init.getWebInfPath() + UploadManager.getInstance().getProperty("UPLOAD_DIR") + content.getZipFile();
            file = new FileInputStream(new File(path));
        } catch (Exception e) {
            return ERROR;
        }

        Long overallSize = null;
        try {
            overallSize = file.getChannel().size();
        } catch (IOException e) {
            e.printStackTrace();
        }

        response.setContentType("application/zip");
        response.addHeader("Content-Disposition", "attachment; filename=\""+content.getZipFile()+"\"");
        response.setHeader("Content-Length", String.valueOf(overallSize));

        ServletOutputStream sos = null;
        try {
            sos = response.getOutputStream();
            int read;
            read = file.read();
            while (read>0){
                sos.write(read);
                read = file.read();
            }
        } catch(Exception e){
          return ERROR;      
        }

        return NONE;

}

**

新xml:

**

<struts>
     <package name="content" namespace="/content" extends="default">
    <action name="download" class="com.tictapps.adserver.web.content.ContentAction" method="download">
        <result name="none"/>
    </action>
</package>
</struts>

1 个答案:

答案 0 :(得分:1)

返回stream结果后,您无法再对OutputStream进行控制。

我想到的第一个确保文件完全下载的方法是:

  1. 直接写入OutputStream,并返回结果NONE(映射为空)而不是SUCCESS(已映射到Stream)。您将完全控制响应,但会丢失一些框架自动。这有效,I've did it in the past

  2. 根据Stream结果的源代码创建自定义结果,例如。 StreamWithConfirm,并添加您需要的逻辑。

  3. 你可以在一个自定义拦截器中进行(显然在后调用部分),但是我不确定,顺便说一句,对于一个新手来说,这将是三个中最难的一个。

  4. n。 1(根据链接的答案调整代码)应该是你需要的。