【问题标题】:How do I find out a size of a stream in NodeJS?如何在 NodeJS 中找出流的大小?
【发布时间】:2021-08-10 02:32:51
【问题描述】:

我正在尝试将 zip 文件上传到 Azure 文件共享。 zip 文件是使用archiver 库生成的,我尝试使用管道上传它。我总是收到错误StorageError: The range specified is invalid for the current size of the resource.。如何找出我的档案的大小?我尝试像这样“收集”拉链的大小:

const uploadStream = new stream.PassThrough();
    zip.pipe(uploadStream);
    zip.finalize();

zip.on("data", (chunk) => {
      this.zipSize += chunk.length;
    });

zip.on("finish", () => {
      console.log(this.zipSize);
      this._callFileService(uploadStream);
    });
async _callFileService(data: stream.PassThrough) {
    fileService.createShareIfNotExists(
      this.name,
      (error, result, response) => {
        if (!error) {

          fileService.createFileFromStream(
            this.name,
            "",
            "test.zip",
            data,
            this.zipSize,
            {},
            function (error, result, response) {
              if (error) {
                console.log(error);
              } else {
                console.log("Done upload");
                console.log(result, response);
              }
            },
          );
        } else {
          console.log("there was an error: ", error);
        }
      },
    );
  }

我也尝试仅获取存档的大小,并尝试使用stream.writableLength,但一切都会引发相同的错误。帮忙?

【问题讨论】:

    标签: javascript node.js azure stream


    【解决方案1】:

    您是否尝试记录您发送到此函数的数据? fileService.createFileFromStream

    编辑: GJ 解决了这个问题:)

    • 根据文档https://www.npmjs.com/package/archiver zip.pointer() 是获取存档总大小的方法。 无需计算“zipSize”。

    • zip.finalize() 应该最后调用以防止竞争条件。 至少在 zip.on("finish") 之后。

    【讨论】:

    • '目录名。使用 '' 引用基本目录' 这是目录参数的描述。我没有看到在函数中记录数据的意义。我知道数据是正确的,因为我尝试将其存储到本地 .zip 文件中,并且一切正常。
    • 我很好奇 zipSize 的值。如果您将 zip 写入文件,它是否包含完全相同数量的数据?此外,我在谷歌上看到的每一个类似错误都指向人们试图下载,而不是上传 O_o。很有趣,但我不确定我是否能提供帮助
    • 哈哈,是的,我也注意到了...当我将 zip 导出到本地机器时,它的大小约为 113KB,同时 data.readableLength 给了我 16430。我尝试将 data.readableLength 乘以十,它似乎工作,但现在当我下载文件并尝试提取它时,我收到一个错误“文件末尾似乎有一些数据”......
    • 我认为 readableLength 只给你一个缓冲区(在你的情况下是 16K)而不是整个数据。但是,zipSize 是 113K 吗?
    • 我终于明白了!!获得存档实际大小的唯一方法是使用zip.pointer(),这有点奇怪,但尽管如此.. 非常感谢您的帮助,请随时编辑您的原始答案,我会接受它为任何可能与此斗争的未来叉子提供答案..
    猜你喜欢
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2017-01-14
    • 2011-04-26
    • 1970-01-01
    • 2018-11-15
    • 2014-11-04
    • 2012-04-09
    相关资源
    最近更新 更多