如何从 Node 中的图片 url 将图片上传到 Google Cloud Storage?

新手上路,请多包涵

给定一个图像 url,我如何将该图像上传到 Google Cloud Storage 以使用 Node.js 进行图像处理?

原文由 Harris Lummis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 603
2 个回答

这是一个 2 个步骤的过程:

  • 使用 requestfetch 在本地下载文件。
  • 用官方 上传到GCL。
   var fs = require('fs');
  var gcloud = require('gcloud');

  // Authenticating on a per-API-basis. You don't need to do this if you auth on a
  // global basis (see Authentication section above).

  var gcs = gcloud.storage({
    projectId: 'my-project',
    keyFilename: '/path/to/keyfile.json'
  });

  // Create a new bucket.
  gcs.createBucket('my-new-bucket', function(err, bucket) {
    if (!err) {
      // "my-new-bucket" was successfully created.
    }
  });

  // Reference an existing bucket.
  var bucket = gcs.bucket('my-existing-bucket');
  var localReadStream = fs.createReadStream('/photos/zoo/zebra.jpg');
  var remoteWriteStream = bucket.file('zebra.jpg').createWriteStream();
  localReadStream.pipe(remoteWriteStream)
    .on('error', function(err) {})
    .on('finish', function() {
      // The file upload is complete.
    });

如果您想将文件保存为 jpeg 图像,则需要编辑 remoteWriteStream 流并添加自定义元数据:

 var image = bucket.file('zebra.jpg');
localReadStream.pipe(image.createWriteStream({
    metadata: {
      contentType: 'image/jpeg',
      metadata: {
        custom: 'metadata'
      }
    }
}))

我在浏览本 文档 时发现了这一点

原文由 Yevgen Safronov 发布,翻译遵循 CC BY-SA 3.0 许可协议

要添加到 Yevgen Safronov 的答案中,我们可以将请求通过管道传输到写入流中,而无需将图像显式下载到本地文件系统中。

 const request = require('request');
const storage = require('@google-cloud/storage')();

function saveToStorage(attachmentUrl, bucketName, objectName) {
  const req = request(attachmentUrl);
  req.pause();
  req.on('response', res => {

    // Don't set up the pipe to the write stream unless the status is ok.
    // See https://stackoverflow.com/a/26163128/2669960 for details.
    if (res.statusCode !== 200) {
      return;
    }

    const writeStream = storage.bucket(bucketName).file(objectName)
      .createWriteStream({

        // Tweak the config options as desired.
        gzip: true,
        public: true,
        metadata: {
          contentType: res.headers['content-type']
        }
      });
    req.pipe(writeStream)
      .on('finish', () => console.log('saved'))
      .on('error', err => {
        writeStream.end();
        console.error(err);
      });

    // Resume only when the pipe is set up.
    req.resume();
  });
  req.on('error', err => console.error(err));
}

原文由 Kevin Lee 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题