首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在支架外壳应用程序中下载文件?

如何在支架外壳应用程序中下载文件?
EN

Stack Overflow用户
提问于 2013-11-08 18:18:26
回答 2查看 1.1K关注 0票数 3

我正在使用Brackets-shell为Windows和OSX构建一个桌面打包应用程序。运行在支架外壳上的应用程序能够从服务器打开动态生成的Excel工作表和PDF文件。在普通浏览器中,对文件的请求是在允许用户保存文件的隐藏iFrame中完成的。但是,在括号shell中,不加载文档。相反,它在iFrame中返回以下错误

代码语言:javascript
运行
复制
Failed to load URL http://my.server.com/generate/test.pdf with error (-3)

谁能告诉我如何让括号下载并将文件保存在本地文件系统上?我已经尝试过brackets.app.openURLInDefaultBrowser,但它不起作用,因为默认窗口没有应用程序使用的身份验证cookie。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2013-11-10 12:52:42

我认为括号-外壳还不支持这一点--似乎CEF-based应用程序必须专门实现一个“下载处理程序”,而括号-外壳还没有做到这一点。This AppJS bug comment的说法大致相同(因为该shell也是基于CEF的)。建议使用Node进行下载也适用于括号-外壳,但在使用身份验证cookie时会遇到与使用openURLInDefaultBrowser()时相同的问题。

如果您下载的是纯文本内容,则完全可以使用括号--外壳的appshell.fs文件IO API来完成,这将修复cookie的情况。但是这些API目前只处理UTF-8文本。

所以我认为你需要打补丁-shell来实现下载功能。起始点是实现一个CefDownloadHandler并从CefClient::GetDownloadHandler返回它。它看起来像是CEF为你处理另存为对话框(see show_dialog arg of callback),所以你可能根本不需要写太多代码。

票数 2
EN

Stack Overflow用户

发布于 2014-02-18 06:31:05

这可以使用Node look at:https://github.com/adobe/brackets/wiki/Brackets-Node-Process:-Overview-for-Developers#Architecture来完成

从标题开始:步骤0:设置扩展。

总之,您可以与websocket上的括号中的节点进行通信。这样,您就可以动态加载节点模块并执行它们。

现在,如果您不使用require,这些指令可能会相当繁重。如果是,那么在这里停止并使用这些指令。如果你没有使用require,你可以“取消”require代码并去掉你需要的东西。我所在的一个项目不得不这样做,因为我们意识到支架不支持pdf下载的时间有多晚。

因此,下面是一些说明,它们将解决您在应用程序中所需的内容。再说一次,这是对一些很好的代码的解构。

警告:这并不美观,也不是让它工作的括号方式。

警告严重警告

创建您的节点保存模块

这与上面的说明是一样的,仍然使用require,但是它被加载到节点中,所以您不必担心项目的应用程序部分的require。保存代码与此类似:https://github.com/joelrbrandt/brackets-simple-node/blob/master/node/SimpleDomain.js

代码语言:javascript
运行
复制
(function () {
    "use strict";
    var url = require('url');
    var http = require('http');
    var https = require('https');
    var fs = require('fs');

    function cmdSaveFileFromUrl(urlString, dest) {
        var requestUrlObject = url.parse(urlString, true);
        var options = {
            hostname: requestUrlObject.hostname,
            port: +requestUrlObject.port,
            path: requestUrlObject.path
        };
        var requester = requestUrlObject.protocol === "http:" ? http : https;
        var file = fs.createWriteStream(dest);
        var request = requester.get(options, function(response) {
            response.on('end', function(){
                file.on('finish', function() {
                    file.close();
                });
            });
            response.pipe(file);
        });
    }

    function init(DomainManager) {
      ...
    }
    exports.init = init;
}());

动态加载此模块

现在,您需要获取将动态加载此模块的appshell代码。为此,您基本上需要括号中的整个NodeConnection模块。此模块负责使websocket to node工作。因此,如果你没有像我这样的要求,你可以“取消”要求它。去掉导出的东西,让它自己返回,把这个包含在你的index.html中。

代码语言:javascript
运行
复制
function NodeConnection() {
    "use strict";
....
    return NodeConnection;
}

调用节点连接的代码

最后,您需要使用节点连接来加载模块并发送命令来执行其任务,同样,括号-shell (appshell)为此提供了模块,但同样,如果您不具有require,则需要提取所需的内容。大多数方法都是实用的方法,并且可以很容易地提取出来。https://github.com/joelrbrandt/brackets-simple-node/blob/master/main.js

从任何位置:

代码语言:javascript
运行
复制
function chain() {
    var functions = Array.prototype.slice.call(arguments, 0);
    if (functions.length > 0) {
        var firstFunction = functions.shift();
        var firstPromise = firstFunction.call();
        firstPromise.done(function () {
            chain.apply(null, functions);
        });
    }
}
function connect() {
    var connectionPromise = nodeConnection.connect(true);
    connectionPromise.fail(function () {
        console.error("[brackets-node] failed to connect to node");
    });
    return connectionPromise;
}
function getNativeBracketsDirectoryPath() {
    var pathname = decodeURI(window.location.pathname);
    var directory = pathname.substr(0, pathname.lastIndexOf("/"));
    return convertToNativePath(directory);
}
function convertToNativePath(path) {
    path = unescape(path);
    if (path.indexOf(":") !== -1 && path[0] === "/") {
        return path.substr(1);
    }

    return path;
}
function loadDomain() {
   var root_url = getNativeBracketsDirectoryPath();
   var path = root_url + "/node/YOUR_NODE_MODULE_FROM_STEP_ONE.js";
   var loadPromise = nodeConnection.loadDomains([path], true);
   loadPromise.fail(function () {
       console.log("[brackets-node] failed to load domain");
   });
   return loadPromise;
}
function saveFile(inUrl, path) {
    path = path || window.appshell.app.getUserDocumentsDirectory()+"/file";
    var memoryPromise = nodeConnection.domains.yourdomain.saveFileFromUrl(inUrl, path);
    memoryPromise.fail(function (err) {
        console.error("[brackets-node] failed to run saveFileFromUrl", err);
    });
    memoryPromise.done(function () {
                    console.log("Check the file");
    });
    return memoryPromise;
}
var  NodeConnectionObject = NodeConnection();
var nodeConnection = new NodeConnectionObject();
chain(connect, loadDomain, function(){
   return saveFile(urlToFetch, file)
});

我希望这对某些人有帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19856553

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档