【问题标题】:Download via http and streaming upload to Google Cloud storage using nodejs通过 http 下载并使用 nodejs 流式上传到谷歌云存储
【发布时间】:2019-05-29 13:42:43
【问题描述】:

我正在争取下载直接流式传输到 GCS 而不保存到文件系统,请参见下面的 sn-p。

const { Storage } = require('@google-cloud/storage');
const http = require('http');
const storage = new Storage();
const fs = require("fs");
const bucketName = 'BUCKETNAMEHERE';
const blobName = 'image.jpg';
const bucket = storage.bucket(bucketName);
const blob = bucket.file(blobName);

const streamDownload = () => {
    http.get("http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg")
        .pipe(blob.createWriteStream({
            metadata: {
                contentType: 'image/jpg'
            }
        }))
        .on("error", (err) => {
            console.error(`error occurred`);
        })
        .on('finish', () => {
            console.info(`success`);
        });
};

永远不会触发完成。没有任何输出。 我可以毫无问题地将 http.get 流式传输到本地文件,所以这部分似乎没问题。

同样有效的是从本地文件系统流式传输到 GCS,如下所示:

const streamFs = () => {
    fs.createReadStream('/path/to/mqdefault.jpg')
        .pipe(blob.createWriteStream({
            metadata: {
                contentType: 'image/jpg'
            }
        }))
        .on("error", (err) => {
            console.error(`error occurred`);
        })
        .on('finish', () => {
            console.info(`success`);
        });
};

第二个 sn-p 记录“成功”并且文件存在于存储桶中。

http.getfs.createReadStream 都创建一个读取流。

我在这里做错了什么?

【问题讨论】:

    标签: node.js google-cloud-platform google-cloud-storage


    【解决方案1】:

    请求库与承诺一起工作,而 http 库需要回调:

    const streamDownload = () => {
    
      var stream = blob.createWriteStream({
        metadata: {
            contentType: 'image/jpg'
        }
      })
    
      http.get("http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg", function(res){
            stream.on("error", (err) => {
                console.error(`error occurred`);
            })
            stream.on('finish', () => {
                console.info(`success`);
            });
            res.pipe(stream)            
        })
    }
    

    【讨论】:

      【解决方案2】:

      切换到request 库确实有效:

      const request = require('request');
      const streamDownload = () => {
          request.get("http://i3.ytimg.com/vi/J---aiyznGQ/mqdefault.jpg")
              .pipe(blob.createWriteStream({
                  metadata: {
                      contentType: 'image/jpg'
                  }
              }))
              .on("error", (err) => {
                  console.error(`error occurred`);
              })
              .on('finish', () => {
                  console.info(`success`);
              });
      };
      

      仍然不确定为什么 http 库没有。

      【讨论】:

        猜你喜欢
        • 2018-08-01
        • 2017-12-06
        • 1970-01-01
        • 1970-01-01
        • 2018-09-18
        • 1970-01-01
        • 2018-07-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多