繁体   English   中英

Apache Wicket:文件下载不会锁定页面

[英]Apache Wicket: File download that would not lock the page

我想创建一个链接,该链接将启动与页面本身异步的文件下载,即,我希望页面在文件下载期间不被锁定。 我应该让它在检票口之外启动吗? 还是在检票口内是否有东西可以让我设置可以绕过页面锁的资源流?

我尝试过的事情:

  • DownloadLink锁定页面,如其文档中所述。 这是我的出发点。

  • ResourceLink没有在文档中明确声明锁定,因此我尝试了此操作,但它也锁定了页面。

  • 至此,我已经研究了两个链接的代码,并注意到它们都通过ResourceStreamRequestHandler安排下载。 期望他的行为可能是特定于处理程序的,所以我试图安排自己编写的自定义处理程序:

     private void sendFile(final File file) throws IOException { IRequestHandler fileDownloadHandler = new IRequestHandler() { @Override public void respond(IRequestCycle requestCycle) { WebResponse response = (WebResponse) requestCycle.getResponse(); OutputStream outStream = response.getOutputStream(); response.setContentType("audio/x-wav"); response.setContentLength((int)file.length()); String fileName = "Somethingsomething.wav"; // sets HTTP header response.setHeader("Content-Disposition", "attachment; filename=\\"" + fileName + "\\""); byte[] byteBuffer = new byte[1024]; DataInputStream in = null; try { in = new DataInputStream(new FileInputStream(file)); int length = 0; // reads the file's bytes and writes them to the response stream while ((in != null) && ((length = in.read(byteBuffer)) != -1)) { outStream.write(byteBuffer,0,length); } in.close(); outStream.close(); } catch (IOException e) { throw new PortalError("IOException trying to write the response", e); } } @Override public void detach(IRequestCycle requestCycle) { } }; getRequestCycle().scheduleRequestHandlerAfterCurrent(fileDownloadHandler); } 
  • 这也不太奏效,所以我作了进一步调查。 我注意到,与我期望的不同,“计划的”请求处理程序不会像我期望的那样在单独的请求上执行,而是在同一请求上执行。 我认为必须是第一个处理程序将页面锁定,然后在第二个处理程序执行时也保持锁定状态。 因此,我试图将下载处理程序强制为单独的请求(通过ajax行为):

     public void startDownload(AjaxRequestTarget target) throws DownloadTargetNotFoundException{ target.appendJavaScript("setTimeout(\\"window.location.href='" + getCallbackUrl() + "'\\", 100);"); } @Override public void onRequest() { sendFile(getFile()); logger.debug("Download initiated"); } 

    我在这里找到了它,希望它可能是我一直在寻找的东西。 但是,毫不奇怪,页面仍然被锁定(我可以想象,因为仍然必须从页面中检索行为,必须为其获取页面锁定)。

我不知所措,我下一步应该去哪里寻找,尤其是在所有这些时间之后,尝试使一个简单的下载链接正常工作。 我正在考虑在检票口上方的另一层上创建另一个Web筛选器,可以在检票口过滤器完成工作(因此已经释放页面锁定)之后,从检票口内发出信号来创建下载文件,但是对于这样的任务。

欢迎任何建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM