1

我目前正在 webkit gtk 视图中运行一个 html 文件。我设置了这些设置:

    let new_settings = new WebKit.WebSettings ();
    new_settings.enable_universal_access_from_file_uris = true;
    this._web_view.set_settings(new_settings);

以为他们会让我在我的电脑上下载一个文件(这不是我想要做的,但我想测试它)。这不起作用:/

负责的html如下:

<a href="resume/resume1.doc"><img class="shadow" src="images/design/1.jpg" alt="img01"></a>

我要做的是在用户单击图像时在 libre office 中自动打开 resume1.doc。我不太确定如何使用 GTK/HTML

谢谢!:)

4

2 回答 2

1

目前尚不清楚该页面是从服务器提供还是在本地加载。

我没有对本地文件执行此操作,但是对于服务器提供的页面,您将监控 mime 类型决策并向 webkit 指示它需要下载它无法处理的 mime 类型(甚至是它可以处理的 mime 类型)句柄,如果你想下载一个网页)。接下来,您将提供一个文件名并监控进度。下载完成后,Webkit 会通知您。允许您执行此操作的信号是

  • mime-type-policy-decision-requested
  • 下载请求
  • 通知::状态

对于本地文件,我不知道上述方法是否可行。如果没有,由于您正在控制页面,您可以拥有可以告诉您文件需要打开而不是导航的链接属性。

一旦获得了任一方法的文件路径,就可以使用 xdg-open 命令或其等效功能在可以处理文件的应用程序中打开文件。

于 2013-07-12T18:18:05.797 回答
0

你有正确的开始。您只需要处理 mime-type 并决定您希望如何打开 Libre Office。这是本地文件的示例(uri 是您要在本地打开的服务器上特定文档的路径):

this._web_view.connect('mime-type-policy-decision-requested',
        (function (webview, frame, request, mimetype, decision) {
            if (mimetype === 'application/msword' ||
                mimetype === 'application/vnd.oasis.opendocument.spreadsheet') {
                // Spawn a libreoffice process with this uri. Necessary because
                // we want to open the files as templates - the `-n` option
                // requires the user to save-as.
                GLib.spawn_async(null, /* cwd */
                                 ['libreoffice', '-n', request.get_uri()],
                                 null, /* inherit environment */
                                 GLib.SpawnFlags.DO_NOT_REAP_CHILD | GLib.SpawnFlags.SEARCH_PATH,
                                 null /* setup function */ );
                decision.ignore();
                return true;

            } else if (mimetype === 'application/pdf') {
                // if PDF, use the build in viewer (usually evince)
                Gtk.show_uri(null, request.get_uri(), 0);
                decision.ignore();
                return true;
            }
            // default handler
            return false;
    }).bind(this));
于 2016-07-14T23:21:04.233 回答