NodeJS 已将图像上传至GCP存储,但无法使用公共URL查看图像

ijxebb2r  于 2023-02-12  发布在  Node.js
关注(0)|答案(1)|浏览(137)

我正尝试使用带有Node.js的PUT签名URL将图像上传到GCP存储,如此处所示。
我使用axios调用包含数据图像的PUT签名URL字符串,上传似乎已成功。当我转到GCP存储控制台查看公共URL时,它无法在浏览器中显示(它会自动下载,当我尝试查看下载的内容时,它已损坏,无法打开)。
但是,如果我使用GCP存储控制台直接上传图像,我可以直接在浏览器中使用公共URL查看图像。

我的努力

正在从服务器端获取PUT签名的URL:

import { Storage } from "@google-cloud/storage";

const storage = new Storage({
    projectId: GCP_PROJECT_ID,
    credentials: {
      client_email: GCP_CLIENT_EMAIL,
      private_key: getFormattedGCPPrivateKey(GCP_PRIVATE_KEY),
    },
  });

const gcpFilePath = "path/to/file.jpeg";
const filePath = storage.bucket("test_bucket").file(gcpFilePath);
const [putUrlImage] = await filePath.getSignedUrl({
    version: "v4",
    action: "write",
    expires: Date.now() + 1000 * 30, // 30 seconds
    contentType: "application/octet-stream",
  });

从前端上传图像:

const imageAsBlob = "..." // looks like: blob:http://localhost:3000/867eb7e4-064d-4092-85ea-90ceb1160a39

const imageAsBase64 = Buffer.from(
    imageAsBlob.replace(/^data:image\/(png|gif|jpeg);base64,/, ""),
    "base64"
  )

const imageData = 
await axios.put(putUrlImage, imageAsBase64, {
      headers: { "Content-Type": "application/octet-stream" },
   });

我的期望

我希望图像可以通过GCP存储提供的公共URL在浏览器中查看。
我不确定这个问题是在PUT签名的URL方面还是图像数据格式化方面。

vlju58qv

vlju58qv1#

@rajat评论帮了忙,还有,我不得不把imageAsBlob改成一个base64,然后才能换掉/^data:image\/(png|gif|jpeg);base64,/, "",然后就成功了!

相关问题