如何将图像从节点/快速REST API上传到Google Cloud Storage?

时间:2020-07-22 15:29:00

标签: node.js rest express google-cloud-storage backend

我正在使用在Netlify功能上部署的node / express / mongoDB构建REST API(该数据库直接来自MongoDB Atlas)。我想做的是创建一个API路由,该路由允许将图像作为POST请求中的字段之一上传。 Express会将该文件上传到Google Cloud Storage,获取新上传的图片网址,并将该网址存储为数据库中的文档字段之一。

我想到的一种选择是使用multer。由于Express被部署为无服务器功能,因此它无权访问任何存储。这意味着我无法使用multer在本地存储图像,并且将其保存在内存中会引起太多潜在的问题(图像是视频游戏的屏幕截图,因此非常大)。现在,这是一个不可行的选择,或者至少不是我的理想选择。

我认为最理想的方法是通过API路由处理直接将此文件直接上传到Google Cloud Storage。 This was achieved by Ben Awad,但我几乎不了解他的代码(resolversexpress.static()Mutation?)。几乎是我每行都要拔头发。

我不知道如何在没有multer的情况下访问从POST请求上传的文件,更不用说直接将其上传到GCS了。

我应该如何处理呢?

1 个答案:

答案 0 :(得分:1)

也许NodeJS GCP storage client可以帮助

在Github自述文件页面中,有一些示例说明如何处理节点和GCP存储。

Here,您可以找到以下上传示例

    function main(bucketName = 'my-bucket', filename = './local/path/to/file.txt') {
      // [START storage_upload_file]
      /**
       * TODO(developer): Uncomment the following lines before running the sample.
       */
      // const bucketName = 'Name of a bucket, e.g. my-bucket';
      // const filename = 'Local file to upload, e.g. ./local/path/to/file.txt';

      // Imports the Google Cloud client library
      const {Storage} = require('@google-cloud/storage');

      // Creates a client
      const storage = new Storage();

      async function uploadFile() {
        // Uploads a local file to the bucket
        await storage.bucket(bucketName).upload(filename, {
          // Support for HTTP requests made with `Accept-Encoding: gzip`
          gzip: true,
          // By setting the option `destination`, you can change the name of the
          // object you are uploading to a bucket.
          metadata: {
            // Enable long-lived HTTP caching headers
            // Use only if the contents of the file will never change
            // (If the contents will change, use cacheControl: 'no-cache')
            cacheControl: 'public, max-age=31536000',
          },
        });

        console.log(`${filename} uploaded to ${bucketName}.`);
      }

      uploadFile().catch(console.error);
      // [END storage_upload_file]
    }

    main(...process.argv.slice(2));