我正在尝试从基于 liferay+struts+Angular 的网站自动下载一些文件(使用 HtmlUnit)。 到目前为止,HtmlUnit 在页面导航和解释 JS 方面做得很好,但是当我尝试下载文件时,它返回的是同一页面,而不是附件。
下载按钮是这样制作的:
<button class="btn" name="filedownload" data-ng-disabled="false"
type="button" data-ng-lick="vm.downloadFile(...things...)">
</button>
我已经尝试过在网上找到的两种主要技术:使用 CollectingAttachmentHandler
和 .getWebResponse().getContentAsStream()
,两者均适用给我起始页而不是附件。
通过使用 Chrome 的网络跟踪器跟踪它,我发现一旦我单击它,它就会调用 2 个不同的端点,第一个端点跟踪此类文件将被加载,第二个端点下载文件,第二个端点有一个使用正确的 Content-Disposition:附件进行响应; filename=
header ,但显然 HtmlUnit 没有拾取它。
这是我尝试过的一些代码片段。
CollectingAttachmentHandler attachmentHandler = new
CollectingAttachmentHandler();
client.setAttachmentHandler(attachmentHandler);
attachmentHandler.handleAttachment(myButton.click());
// I get only one attachment, the page
List<Attachment> attachments = attachmentHandler.getCollectedAttachments();
try (InputStream in = myButton.click().getWebResponse().getContentAsStream();
OutputStream out = Files.newOutputStream(new File(""...my_file...).toPath())) {
IOUtils.copy(in, out);
}
// In my file I find the page
编辑:
我在HtmlUnit的github上开了一张票,作者很慷慨地回复了我,并给了我一些建议,比如检查是否使用client.getWebWindows()
打开了新窗口。不幸的是,这不是我的情况,但我也将其发布在这里,以防有人发现它有帮助。
最佳答案
至少您可以使用 WebConnectionWrapper 来拦截/获取所有请求响应周期的通知。 请参阅http://htmlunit.sourceforge.net/faq.html#HowToModifyRequestOrResponse一个简短的示例。
关于java - 使用 HtmlUnit 下载 xhr 时缺少附件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57514934/