【问题标题】:Download file with HTTP or HTTPS in Node在 Node 中使用 HTTP 或 HTTPS 下载文件
【发布时间】:2016-07-15 23:18:51
【问题描述】:

我知道如何使用http 库和https 库下载文件。

但是,如果我想让用户选择两者都做,我该怎么办?

目前我的代码看起来像这样

var downloadFile = function (url) {
  var protocol = url.replace(/^(.*?):.*/, '$1');
  var protocolLibrary = require(protocol);
  protocolLibrary.get(url, function (response) { ... });
};

这是最好的方法吗?

【问题讨论】:

  • 那么,这里最大的问题是什么?您似乎已经知道根据用户的需要使用http.get()https.get()。您还需要什么帮助?
  • 是的,它是服务器端。我在客户端上有一个简单的表单,用户可以在其中输入 URL。提交表单时,会调用downloadFile(url)
  • 那么,问题是什么?查看网址并调用http.get()https.get(),就像您已经尝试做的那样。
  • 这是最佳实践吗?动态地要求库对我来说似乎很笨拙。要求库会动态增加调用的大量额外时间吗?
  • 好的,我添加了一个答案,以更安全的方式选择适当的协议库。

标签: node.js file http https download


【解决方案1】:

你的做法留下了一个巨大的安全漏洞,最终用户可能会导致服务器上几乎所有现有的节点模块运行(如果他们知道它的路径或者它已经在 require() 搜索中路径)。

您可以将可选择的库限制为预加载的几个,如下所示:

var urlParser = require('url');

var supportedLibraries = {
    "http:": require('http'),
    "https:": require('https')
};

function downloadFile(url) {
    var parsed = urlParser.parse(url);
    var lib = supportedLibraries[parsed.protocol || "http:"];
    if (lib) {
        lib.get(url, function (response) { ... });
    } else {
        // error for invalid protocol
    }
};

【讨论】:

  • 我不想提供文件。我正在下载它们。现在更新问题
  • 我没有为客户下载文件。我需要服务器下载它然后上传到 S3
  • @merlinpatt - 我当前的解决方案是否可以解决您的问题?如果是这样,请通过选中答案左侧的绿色复选标记将此(或其他答案)标记为您选择的答案,这将向社区表明您的问题已得到解答,并将为您赢得一些可以赚取的声誉积分随着时间的推移,您将获得更多特权。
猜你喜欢
  • 2019-10-06
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 2019-12-14
  • 2020-02-06
  • 2017-01-12
  • 1970-01-01
  • 2014-05-26
相关资源
最近更新 更多