首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS-Lambda仅从web部分下载文件

AWS-Lambda仅从web部分下载文件
EN

Stack Overflow用户
提问于 2019-01-09 19:54:39
回答 2查看 527关注 0票数 0

我有一个AWS Lambda函数,可以从链接(在代码中)下载随机YT视频的mp3文件。

在本地运行时,该文件完成下载,最后文件大小约为8mb。但在Lambda上执行时,它只下载了大约17kb~的文件。

代码语言:javascript
复制
let link = "http://cdl29.convert2mp3.net/download.php?id=youtube_ivpU-4LJaZk&key=hvjquS9UNKoq&d=y"

request
.get(link)
.pipe(fs.createWriteStream("/tmp/name"))
.on("finish", () => {
    console.log(fs.statSync("/tmp/name").size/1000000.0)
    fs.readFile('/tmp/name', function(err, content) {
        if (err) return callback(err)
        console.log("Got here")
    })
})

没有错误,一切都运行成功。但在Lambda上运行时,fs.createWriteStream似乎在下载完成之前就完成了。有什么想法吗?

编辑:实际上,在Elliot Nelson的帮助下,我看到它正在下载一个HTML文件。这很奇怪,因为我传递了一个到脚本的直接链接。似乎它只是重定向到网站的主页,这是我从未见过的发生在我的家用机器上。

EN

回答 2

Stack Overflow用户

发布于 2019-01-09 20:08:13

看起来您的lambda在下载完成之前就完成了执行。

您使用的节点版本是什么?

如果是Node6 ->,则不是在成功下载后调用回调,而是仅在错误期间调用

如果是Node8的->,那就把回调都忘了,用promise代替。AWS实际上希望您返回一个已解决或被拒绝的承诺,表明成功或错误。

代码语言:javascript
复制
module.exports.handle = event => new Promise((resolve, reject) => {

   let link = "http://cdl29.convert2mp3.net/download.php?id=youtube_ivpU-4LJaZk&key=hvjquS9UNKoq&d=y"

  request
  .get(link)
  .pipe(fs.createWriteStream("/tmp/name"))
  .on("finish", () => {
      console.log(fs.statSync("/tmp/name").size/1000000.0)
      fs.readFile('/tmp/name', function(err, content) {
        console.log("Got here")
        err ? reject(err) : resolve(content);
      })
   })

});
票数 0
EN

Stack Overflow用户

发布于 2019-01-09 22:19:27

我的猜测是,由于服务器上的逻辑,您看到了行为上的不同。

可能性:

(1)您已在本地浏览器上登录(可能没有意识到)。尝试转到匿名窗口中的相同链接来测试这一点。该服务可能需要凭据,否则它会重定向您。

(2)业务正在检查用户代理。您可以尝试在本地卷曲URL来测试这一点,而不是通过浏览器。

(3)它是通过IP阻塞的--在您的机器上也可以使用完全相同的javascript逻辑吗?如果您可以访问它,您可以在您的机器、另一台机器、可能是EC2实例等上尝试相同的代码,并查看它可能检查的标准。

如果所有其他方法都失败了,您可以直接联系网站管理员,解释您正在做什么,并查看是否有解决方法。他们可能会明确地阻止你正在尝试做的事情。

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

https://stackoverflow.com/questions/54109562

复制
相关文章

相似问题

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