NodeJS 从Google Cloud存储中读取图像并使用Google Cloud功能发送

p8h8hvxi  于 2023-06-29  发布在  Node.js
关注(0)|答案(3)|浏览(140)

我想做以下事情:创建一个Google Cloud Function(http触发),从存储桶(Google Cloud Storage)中读取图像文件并将其作为响应发送。
我尝试了一些组合,我认为应该是这样的:

'use strict';
const gcs = require('@google-cloud/storage')();

exports.sendImage = function sendImage(req, res) {
    let bucket = gcs.bucket('my-bucket-name');
    let myImage = bucket.file('my-image-file.jpg');

    res.contentType('image/jpeg');
    res.end(myImage, 'binary');
};

上面的函数部署成功,但当我只使用url(在浏览器上)触发它时,它没有显示任何结果。
我这样做是尽可能简单的,因为如果它可以处理一个图像,我可以改进代码来调用任何图像。
我的最终目标是有类似于这篇文章中显示的东西:https://medium.com/google-cloud/uploading-resizing-and-serving-images-with-google-cloud-platform-ca9631a2c556
但运行在Google Cloud Functions上。如果我设法发送一个简单的图像,我可以使用一些模块,如node-image-resize的最终结果。

3npbholx

3npbholx1#

我可以自己找到它,我认为它可以帮助很多人。请执行以下操作:
1 -在Google Cloud Storage上创建一个存储桶,假设名称为[my-bucket]
2 -创建一个Google Cloud Function,我们将其命名为imageServer。
3 -不要忘记编辑package.json文件。我的答案如下:

{
  "name": "image-server",
  "version": "0.0.1",
    "dependencies": {
    "@google-cloud/storage": "^1.2.1"
  }
}

4 -发送简单图像的代码非常简单(在我弄清楚之后):

'use strict';

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

exports.imageServer = function imageSender(req, res) {
  let file = gcs.bucket('my-bucket').file('test-1.jpg');
  let readStream = file.createReadStream();

  res.setHeader("content-type", "image/jpeg");
  readStream.pipe(res);

};

Obs:测试镜像是名为[test-1.jpg]的文件,它位于bucket的根目录。所以,从这里,我可以把它发送到浏览器。现在只需要修改代码来实现我的主要目标,就像我在问题中所说的那样。
希望能帮上忙。
参考链接:Google Cloud Storage NPMGoogle cloud Functions Hello World tutorial

f0brbegy

f0brbegy2#

谢谢你,这是非常有帮助的,让我走上了正确的道路。我想使用Firebase云函数从存储桶中获取文件,该函数与Google Cloud Storage紧密集成,然后通过https提供服务。
我还想首先检查bucket中的文件是否存在,如果不存在,则提供bucket中的占位符图像。
经过一些谷歌搜索,我找到了文件.exists()方法的例子,我最终得到了这个:
第一个

const functions = require("firebase-functions");
const {initializeApp} = require("firebase-admin/app");
const {getStorage} = require("firebase-admin/storage");

然后,

initializeApp({
  storageBucket: "my-bucket-name",
});

然后我导出了一个returnPhoto函数来通过https提供照片

exports.returnPhoto = functions.https.onRequest((req, res) => {
  let file = bucket.file("image_name.jpg");
  file.exists().then(function(data) {
    const exists = data[0];
    if (exists) {
      file.createReadStream()
          .on("error", function() {
            console.log("Error while fetching the requested photo.");
            res.end();
          })
          .pipe(res.setHeader("content-type", "image/jpeg"));
    } else {
      file = bucket.file("notfound_image.jpg");
      file.createReadStream()
          .on("error", function() {
            console.log("Error while fetching notfound_image.jpg");
            res.end();
          })
          .pipe(res.setHeader("content-type", "image/jpeg"));
    }
  });
});
bpzcxfmw

bpzcxfmw3#

我正在写C#应用程序,但你的回复帮助了我很多。
如果有人对C#版本感兴趣,那么就在这里

namespace ProductivityTools.Journal.ImageProvider
{
    public class Function : IHttpFunction
    {
        const string ProjectId = "ptjournal-b53b0";
        public async Task HandleAsync(HttpContext context)
        {
            var client = StorageClient.Create();
            var bucketName = "ptjournaltest1";

            context.Response.ContentType= "image/jpeg";
            using (var stream = new MemoryStream())
            {
                client.DownloadObject(bucketName, "Untitled.png", stream);
                await context.Response.BodyWriter.WriteAsync(stream.ToArray());
            }
        }
    }
}

相关问题