我已经检查了this SO question,但仍无法找到解决方案。
我正在尝试查看脱机HTML文件。该文件可以存储在Storage
或FileSystemStorage
。但是,我不确定如何获取Storage
中文件的网址,因此我使用了FileSystemStorage.getAppHomePath
。我使用的代码如下所示:
BrowserComponent bc = new BrowserComponent();
String appPath = fs.getAppHomePath();
bc.setURL(appPath + "1.html");
使用以下命令从Web下载HTML(以及未显示的支持文件):
Util.downloadUrlToFile("https://google.com", appPath + "1.html", false);
.cn1/
文件夹包含1.html,但未加载该页面。错误代码是
Received exception: File not found
java.lang.Throwable: File not found
at javafx.scene.web.WebEngine$LoadWorker.describeError(WebEngine.java:1463)
at javafx.scene.web.WebEngine$LoadWorker.dispatchLoadEvent(WebEngine.java:1402)
at javafx.scene.web.WebEngine$LoadWorker.access$1200(WebEngine.java:1280)
at javafx.scene.web.WebEngine$PageLoadListener.dispatchLoadEvent(WebEngine.java:1267)
at com.sun.webkit.WebPage.fireLoadEvent(WebPage.java:2499)
at com.sun.webkit.WebPage.fwkFireLoadEvent(WebPage.java:2343)
at com.sun.webkit.network.URLLoader.twkDidFail(Native Method)
at com.sun.webkit.network.URLLoader.notifyDidFail(URLLoader.java:883)
at com.sun.webkit.network.URLLoader.lambda$didFail$104(URLLoader.java:866)
at com.sun.javafx.application.PlatformImpl.lambda$null$173(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$174(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$148(WinApplication.java:191)
at java.lang.Thread.run(Thread.java:748)
另一种方法,
String html = Util.readToString(fs.openInputStream(appPath + "1.html"));
bc.setPage(html, appPath);
可以显示html但不加载支持文件,即.js
文件。将.js
内容复制到<script>
标记中的html可让所有内容正确显示。
我想问一下这个行为是否是由于代码中的任何错误造成的,我该如何解决这个问题呢?
答案 0 :(得分:0)
下载方法是异步的,因此在您调用请求时文件不在那里,但在您完成时就在那里。
您尝试做的事情(离线浏览器)的现实并不那么简单。您不仅需要下载HTML,还需要获取其所有依赖项(JavaScript,CSS,图像等)并在本地保存整个层次结构。此外,您需要对所有依赖项执行相同操作,例如CSS和JS文件也可以包含文件,这些文件与托管它们的服务器相关。
<强>更新强>
我再次尝试根据评论中的说明重现它,但我仍然无法做到:
Form hi = new Form("Browser", new BorderLayout());
BrowserComponent bc = new BrowserComponent();
String appPath = FileSystemStorage.getInstance().getAppHomePath();
bc.setURL(appPath + "1.html");
hi.add(CENTER, bc);
hi.show();
然后我在1.html
目录中使用了硬编码文件.cn1
:
<html><button>click me</button></html>
它有效: