我正尝试使用带有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方面还是图像数据格式化方面。
1条答案
按热度按时间vlju58qv1#
@rajat评论帮了忙,还有,我不得不把
imageAsBlob
改成一个base64,然后才能换掉/^data:image\/(png|gif|jpeg);base64,/, ""
,然后就成功了!