【问题标题】:Check if stream from HttpServletResponse was download by client - JAVA检查来自 HttpServletResponse 的流是否被客户端下载 - JAVA
【发布时间】:2016-04-09 19:55:07
【问题描述】:

基本上,我的系统会生成 url 以从我的服务器下载文件。我使用 Struts 进行此操作,结果为“流”类型。这工作很棒。 现在我想注意每个下载的文件是否已完全下载。

我一直在寻找一段时间,但真的不知道如何继续。我是这方面的初学者。

**

新动作:

**

  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>

【问题讨论】:

  • 代码看起来不错。

标签: java apache http tomcat struts2


【解决方案1】:

一旦您返回 stream 结果,您就无法再控制 OutputStream。

我首先想到的确保文件完全下载的方法是:

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

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

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

n. 1(改编链接答案中的代码)应该是您需要的。

【讨论】:

  • 好的,谢谢,我试着做第一,但不知道如何继续。请检查新信息。
  • 1.关闭 ServletOutputStream(最好在 finally{} 块中); 2.如何继续?当您到达return NONE; 时,文件已完全下载!在返回之前做你需要做的事情;)还记得在你觉得满意时投票并接受答案。
  • 我很抱歉,但这样我总是下载一个 5 字节的文件(无效)。关闭sos时Chrome栏出现下载,但回行后才开始下载。
  • 然后我收到此错误:org.apache.struts2.dispatcher.Dispatcher 错误严重:处理请求期间发生异常:No puedo llamar a sendError() tras llevar a cabo la respuesta java.lang .IllegalStateException:在 org.apache.struts2.dispatcher.ServletDispatcherResult.doExecute(ServletDispatcherResult. java:150) 在 org.apache.struts2.dispatcher.StrutsResultSupport.execute(StrutsResultSupport.java:186) 在 ...
  • 太棒了。有效!我也在读 fil while>0 (它必须是!=-1)。最后一个问题:如果到达 sos.close 行,您可以确保文件已正确传递?
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
相关资源
最近更新 更多