node js 从 URL 获取 Zip 并上传到 Google 云端硬盘

2024-03-29

我正在尝试从网址获取 zip 文件,以便在下一步中将其上传到 Google 云端硬盘。但我的代码不起作用。

// The method to get the zip File from the url

function getFile(){

var file = request({
  method : "GET",
  url : "https://start.spring.io/starter.zip",
  encoding: null // <- this one is important !
}, function (error, response, body) {
  if(error ||  response.statusCode !== 200) {
    // handle error
    return;
  }
  JSZip.loadAsync(body).then(function (zip) {
    return zip.file("content.txt").async("string");
  }).then(function () {
    console.log(text);
  });
});
}

// method to upload zip to drive 

function uploadFile(auth) {
    const drive = google.drive({ version: 'v3', auth });
    var fileMetadata = {
        'name': 'demo.zip'
    };
    var media = {
        mimeType: 'application/zip',
        body: fs.createReadStream(getFile())
    };
    drive.files.create({
        resource: fileMetadata,
        media: media,
        fields: 'id'
    }, function (err, res) {
        if (err) {
            // Handle error
            console.log(err);
        } else {
            console.log('File Id: ', res.data.id);
        }
    });
}

我想从上面的 url 获取 zip 文件,但它抛出异常:

new ERR_INVALID_ARG_TYPE(propName, ['string', 'Buffer', 'URL'], path);

当我改变身体时:fs.createReadStream(getFile())到身体:fs.createReadStream("https://start.spring.io/starter.zip")

the Exception is: no such file or directory, open 'https://start.spring.io/starter.zip

  • 您想要从 URL 下载 zip 文件并将其上传到您的 Google 云端硬盘。
  • 您希望使用 googleapis 和 Node.js 来实现此目的。
  • 您已经能够使用 Drive API 获取和放置文件。

如果我的理解是正确的,那么这个修改怎么样?

修改要点:

  • 从 URL 检索的值request可以用来上传。
  • 从上传的 URL 检索到的值是缓冲区。所以请将其转换为readstream类型。

当以上几点反映到您的脚本中时,它会变成如下所示。

修改后的脚本:

function getFile() {
  return new Promise(function(resolve, reject) {
    request(
      {
        method: "GET",
        url: "https://start.spring.io/starter.zip",
        encoding: null // <- this one is important !
      },
      function(error, response, body) {
        if (error && response.statusCode != 200) {
          reject(error);
          return;
        }
        resolve(body);
      }
    );
  });
}

function uploadFile(auth) {
  const stream = require("stream"); // In this script, use this module.

  getFile().then(body => {
    const bs = new stream.PassThrough();
    bs.end(body);
    const drive = google.drive({ version: "v3", auth });
    var fileMetadata = {
      name: "demo.zip"
    };
    var media = {
      mimeType: "application/zip",
      body: bs // Modified
    };
    drive.files.create(
      {
        resource: fileMetadata,
        media: media,
        fields: "id"
      },
      function(err, res) {
        if (err) {
          // Handle error
          console.log(err);
        } else {
          console.log("File Id: ", res.data.id);
        }
      }
    );
  });
}

其他图案:

当然,uploadFile()也可以修改如下。

async function uploadFile(auth) {
  const stream = require("stream"); // In this script, use this module.

  const buffer = await getFile();
  const bs = new stream.PassThrough();
  bs.end(buffer);

  const drive = google.drive({ version: "v3", auth });
  var fileMetadata = {
    name: "demo.zip"
  };
  var media = {
    mimeType: "application/zip",
    body: bs // Modified
  };
  drive.files.create(
    {
      resource: fileMetadata,
      media: media,
      fields: "id"
    },
    function(err, res) {
      if (err) {
        // Handle error
        console.log(err);
      } else {
        console.log("File Id: ", res.data.id);
      }
    }
  );
}

参考:

  • 类:stream.PassThrough https://nodejs.org/api/stream.html#stream_class_stream_passthrough
  • google-api-nodejs-客户端 https://github.com/googleapis/google-api-nodejs-client/tree/master/samples/drive
  • 文件:创建 Drive API v3 https://developers.google.com/drive/api/v3/reference/files/create

在我的环境中,我可以确认这个修改后的脚本有效。但如果我误解了你的问题并且这不是你想要的结果,我深表歉意。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

node js 从 URL 获取 Zip 并上传到 Google 云端硬盘 的相关文章

随机推荐

  • 在 IE8 中,jquery-ui 的对话框将其内容的高度设置为零。我怎样才能解决这个问题?

    我正在使用 jquery UI 的对话框小部件在我的 Web 应用程序中呈现模式对话框 我通过将所需 DOM 元素的 ID 传递到以下函数来实现此目的 var setupDialog function eltId eltId dialog
  • 集成 bootstrap-select 以与 Ember 配合使用

    我想得到引导选择 https github com silviomoreto bootstrap select使用 Ember js Ember 对视图对象的管理存在一些问题 导致其无法按预期工作 JSFiddle http jsfiddl
  • 不兼容的 firebase 库

    我使用的是最新版本com google firebase firebase core 16 0 3和最新版本的com google firebase firebase messaging 17 3 1 但它们取决于不同的版本com goog
  • 列出 Google Fonts API 中的所有可变字体?

    我需要通过 Google Fonts API 获取所有可用的可变字体的列表 我可以从这个端点获取所有字体名称 您可以添加一些参数 但我认为其中不包括可变字体过滤器 我认为在进行 API 调用后我无法过滤结果 这里的 Open Sans 是一
  • 创建的 Iframe 和扩展、google chrome 扩展之间的通信

    我尝试从从我的扩展程序加载的 iframe 发送消息到我的扩展程序 后台脚本或内容脚本 创建的 Iframe 通过内容脚本从扩展加载 我正在寻找一种沟通方式 但我所有的尝试都失败了 清单 json author background pag
  • 在 Pandas DataFrame 上滚动应用速度更快?

    改进这个问题 https stackoverflow com questions 21040766 python pandas rolling apply two column input into function它提供了一个巧妙的解决方
  • 使用泛型类型反射执行类

    我想在使用反射 查找接口实现 找到它之后 在使用泛型类型的类上动态执行方法 下面是我陷入困境的一个例子 非常感谢您的帮助 Setup public interface IActionRequired
  • 关于在 Perl 中将混合编码文件转换为 UTF8 的问题

    我正在将我们大学中国研究系古老的基于 DOS 的图书馆程序生成的文件转换为更有用和更易于访问的文件 我正在处理的问题之一是导出的文本文件 大小约为 80MB 采用混合编码 我在 Windows 上 我认为德语元音变音和其他高级 ASCII
  • 如何为 SwiftUI 列表中的各个行设置动画?

    我想显示一个列表 其中每一行都显示不透明动画并且延迟逐渐增加 因此 第一行应在 0 1 秒后出现 第二行应在 0 3 秒后出现 第三行应在 0 5 秒后出现 依此类推 我尝试了以下方法 但它不起作用 因为所有行都会同时出现并且没有动画 任何
  • 分布式环境中会话ID的唯一性?

    我们正在使用 Spring Session 由关键的 Gemfire 备份 来运行在分布式环境中的 Spring Boot 应用程序 在这样的分布式环境中 Spring Session 是否确保新的会话使用唯一的会话 id 跨不同 JVM
  • 图表中的最小损坏成本

    给定一个图 G V E 其中有 N 个节点 编号从 0 到 N 1 并且恰好为 N 1 双向边缘 图中的每条边都有一个正成本 C u v 边缘权重 整个图是这样的任何一对节点之间都有唯一的路径 我认为改进的 Kruskal 是正确的选择 取
  • DateTimePicker 永远不会更新!

    我有一些DateTimePicker是一种永不更新的形式 我试过了Value and Text Invalidate 进而Update 并且Refresh 从当前日期开始 他们的价值观似乎没有任何改变 无论我设置什么 当前日期都是 相对 今
  • 自动登录其他网站的php脚本

    我想要一个脚本 通过它我可以登录其他网站而无需打开他们的登录页面 场景是这样的 我不想将登录 ID 和密码提供给他人 他们只需单击链接或按钮 脚本就会完成其工作 它将传递所需的登录 ID 和密码 并提交登录表单并登录 并且客户端拥有所有凭据
  • 如何使用单个bat文件传递动态参数来运行一个exe

    我需要运行一个 EXE 它将采用 7 个参数 其中一个参数是动态的 有人可以帮助我如何通过使用bat文件传递动态参数来运行EXE吗 谢谢 柴塔尼亚 如果您需要执行带有动态数量参数的命令 您可以使用 命令示例 foo exe options
  • C 变量名定义中使用下划线的原因是什么?

    我试图了解开发人员何时需要定义C前面带有 的变量 其原因何在 例如 uint32 t xyz 0 也许这有帮助 来自 C99 7 1 3 保留标识符 所有以下划线和大写字母或其他字母开头的标识符 下划线始终保留用于任何用途 所有以下划线开头
  • 如何解释 Google perf 工具 CPU 分析器中的地址

    我的 C 程序消耗大量 CPU 并且在运行时消耗更多 我使用 Google 性能工具来分析 CPU 使用情况 这就是我得到的结果 pprof top Total 1343 samples 1330 99 0 99 0 1330 99 0 0
  • 是否可以让ScrollView滚动到底部?

    对于一个类似聊天的应用程序 我想保留一个ScrollView组件滚动到底部 因为最新消息出现在旧消息下方 我们可以调整a的滚动位置吗ScrollView For React Native 0 41 及更高版本 您可以使用内置的scrollT
  • 如何获取 Spring Boot 应用程序建立的活动数据库连接数

    我已经使用 Oracle 数据源构建了一个 Spring Boot 应用程序 我需要在日志语句中打印总活动连接 如何获取活动连接 注意 不是最大活动连接数 它应该是 特定时间 实例的活动连接数 DataSource dataSource D
  • iOS 金属线宽

    我想设置我在金属中绘制的线条的宽度 我可以设置一个点的大小point size正如所解释的here https developer apple com library prerelease ios documentation Metal R
  • node js 从 URL 获取 Zip 并上传到 Google 云端硬盘

    我正在尝试从网址获取 zip 文件 以便在下一步中将其上传到 Google 云端硬盘 但我的代码不起作用 The method to get the zip File from the url function getFile var fi