【问题标题】:Codenameone load HTML from Storage / FileSystemStorageCodenameone 从 Storage / FileSystemStorage 加载 HTML
【发布时间】:2018-03-03 13:47:43
【问题描述】:

我检查了this SO question,但仍然找不到解决方案。

我正在尝试查看脱机 HTML 文件。该文件可以存储在StorageFileSystemStorage。但是,我不确定如何获取Storage 中文件的 URL,所以我使用了FileSystemStorage.getAppHomePath。我使用的代码如图所示:

    BrowserComponent bc = new BrowserComponent();
    String appPath = fs.getAppHomePath();
    bc.setURL(appPath + "1.html");

HTML(以及未显示的支持文件)是通过以下方式从 Web 下载的:

    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 内容复制到 html 中的 <script> 标记中,可以正确显示所有内容。


我想问一下这种行为是否是由于我的代码中的任何错误造成的,我该如何解决这个问题?

【问题讨论】:

  • 可能不相关,但我已经简要查看了代码,CodenameOneImplementation#setBrowserURL 包含这一行,看起来有点可疑: InputStream i = Display.getInstance().getResourceAsStream(getClass() , url.substring(6));模拟器可能使用另一种实现,因为在那里添加断点不会影响模拟器

标签: codenameone


【解决方案1】:

下载方法是异步的,因此当您调用请求时文件不存在,但在您完成时存在。

您正在尝试做的事情(离线浏览器)的实际情况并不那么简单。您不仅需要下载 HTML,还需要获取其所有依赖项(JavaScript、CSS、图像等)并将整个层次结构保存在本地。此外,您需要对所有依赖项执行相同的操作,例如CSS 和 JS 文件也可以包含文件,这些文件与托管它们的服务器相关。

更新:

我根据 cmets 中的说明再次尝试重现它,但我仍然无法这样做:

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();

然后我使用了.cn1目录下的硬编码文件1.html

<html><button>click me</button></html>

它奏效了:

【讨论】:

  • 确实,我检查了FileSystemStorage 中包含的所有内容,并且/.cn1 的HTML 在桌面浏览器中显示没有问题。即使在第二次运行模拟器时(当文件已经存在时),调用bc#setURL时仍然会抛出相同的java.lang.Throwable: File not found,因此异步性质或文件依赖关系可能与此处无关
  • 物理路径是什么? appPath 的价值是什么?您在层次结构中有一个名为html 的目录吗?如果是这样,它可能属于特殊情况
  • html 的路径是C:\Users\username\.cn1\1.html,appPath 是file://home/,导致java.lang.Throwable: File not found 的浏览器的url 是file://home/1.html。没有创建目录。对Util.readToString(FileSystemStorage.getInstance().openInputStream("file://home/1.html") 的调用将html 正确返回为String,然后可以由bc.setPage(html, appPath) 显示
  • 用户名是否包含路径中的空格或特殊的非拉丁字符?
  • 我们发现了问题:github.com/codenameone/CodenameOne/commit/… 应该会在下周更新中修复
猜你喜欢
  • 2015-08-28
  • 1970-01-01
  • 2020-03-19
  • 2019-08-06
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多