因此,我和我的团队正在努力使用云功能将 SVG 上传和检索到 Firebase 存储。使用我们构建的功能,我们可以上传除 SVG 之外的任何图像。由于某种原因,SVG 无法工作,我不知道我们是否编码错误或者其他什么原因
这是我的函数文件
const admin = require("firebase-admin");
const { nanoid } = require("nanoid");
const mime = require("mime-types");
const { validateCauseImageFile } = require("./fileTypeUtils");
const { imageStorageUrlMatch } = require("./regularExpression");
module.exports.imageValidationAndUpload = async (image) => {
try {
console.log("Image in base 64", image);
const bucket = admin.storage().bucket();
const mimeType = image.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/)
? image.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/)[1]
: null;
const fileExtension = mime.extension(mimeType);
console.log(fileExtension);
const fileName = nanoid() + `.${fileExtension}`;
console.log("Mime type", mimeType);
const base64EncodedImageString = image.replace(
/^data:image\/\w+;base64,/,
""
);
const imageBuffer = Buffer.from(base64EncodedImageString, "base64");
const result = await validateCauseImageFile(imageBuffer.length, mimeType);
if (result.success) {
const token = nanoid();
const options = {
gzip: true,
metadata: {
contentType: mimeType,
metadata: {
firebaseStorageDownloadTokens: token,
},
},
};
const filePath = "testSvg/" + fileName;
const file = bucket.file(filePath);
await file.save(imageBuffer, options);
const response = await file.getSignedUrl({
action: "read",
expires: "03-17-2025", // this is an arbitrary date
});
return { success: true, response: response[0] };
// return response;
} else if (image.match(imageStorageUrlMatch)) {
return { success: true, url: image };
} else {
const errorObject = { status: 403, message: result.message };
throw errorObject;
}
} catch (err) {
console.log("show error message : ", err.message);
return { success: false, message: err.message };
}
};
如果我上传 png/jpeg/jpg 图像,那么它将被上传并正常工作,但对于 SVG,它将被上传但不会渲染任何内容。在 Firebase 存储控制台存储桶上,这是它的显示方式
对于 SVG 图像
对于 png 或任何其他图像
上传过程正常,但 SVG 无法渲染或无法正确检索。这是两个文件的 URL
最佳答案
根据您的屏幕截图,SVG 图像将以 Content-Type image/svg+xml
传输。
根据您的代码,该内容类型的计算如下:
const mimeType = image.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/)
? image.match(/data:([a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+).*,.*/)[1]
: null;
这意味着您的图像数据 URL 应该是这样的:
data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgdmlld0JveD0iMCAwIDEwMCAxMDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDEwMCAxMDAiIHhtbDpzcGFjZT0icHJlc2VydmUiIGhlaWdodD0iMTAwcHgiIHdpZHRoPSIxMDBweCI+CjxnPgoJPHBhdGggZD0iTTI4LjEsMzYuNmM0LjYsMS45LDEyLjIsMS42LDIwLjksMS4xYzguOS0wLjQsMTktMC45LDI4LjksMC45YzYuMywxLjIsMTEuOSwzLjEsMTYuOCw2Yy0xLjUtMTIuMi03LjktMjMuNy0xOC42LTMxLjMgICBjLTQuOS0wLjItOS45LDAuMy0xNC44LDEuNEM0Ny44LDE3LjksMzYuMiwyNS42LDI4LjEsMzYuNnoiLz4KCTxwYXRoIGQ9Ik03MC4zLDkuOEM1Ny41LDMuNCw0Mi44LDMuNiwzMC41LDkuNWMtMyw2LTguNCwxOS42LTUuMywyNC45YzguNi0xMS43LDIwLjktMTkuOCwzNS4yLTIzLjFDNjMuNywxMC41LDY3LDEwLDcwLjMsOS44eiIvPgoJPHBhdGggZD0iTTE2LjUsNTEuM2MwLjYtMS43LDEuMi0zLjQsMi01LjFjLTMuOC0zLjQtNy41LTctMTEtMTAuOGMtMi4xLDYuMS0yLjgsMTIuNS0yLjMsMTguN0M5LjYsNTEuMSwxMy40LDUwLjIsMTYuNSw1MS4zeiIvPgoJPHBhdGggZD0iTTksMzEuNmMzLjUsMy45LDcuMiw3LjYsMTEuMSwxMS4xYzAuOC0xLjYsMS43LTMuMSwyLjYtNC42YzAuMS0wLjIsMC4zLTAuNCwwLjQtMC42Yy0yLjktMy4zLTMuMS05LjItMC42LTE3LjYgICBjMC44LTIuNywxLjgtNS4zLDIuNy03LjRjLTUuMiwzLjQtOS44LDgtMTMuMywxMy43QzEwLjgsMjcuOSw5LjgsMjkuNyw5LDMxLjZ6Ii8+Cgk8cGF0aCBkPSJNMTUuNCw1NC43Yy0yLjYtMS02LjEsMC43LTkuNywzLjRjMS4yLDYuNiwzLjksMTMsOCwxOC41QzEzLDY5LjMsMTMuNSw2MS44LDE1LjQsNTQuN3oiLz4KCTxwYXRoIGQ9Ik0zOS44LDU3LjZDNTQuMyw2Ni43LDcwLDczLDg2LjUsNzYuNGMwLjYtMC44LDEuMS0xLjYsMS43LTIuNWM0LjgtNy43LDctMTYuMyw2LjgtMjQuOGMtMTMuOC05LjMtMzEuMy04LjQtNDUuOC03LjcgICBjLTkuNSwwLjUtMTcuOCwwLjktMjMuMi0xLjdjLTAuMSwwLjEtMC4yLDAuMy0wLjMsMC40Yy0xLDEuNy0yLDMuNC0yLjksNS4xQzI4LjIsNDkuNywzMy44LDUzLjksMzkuOCw1Ny42eiIvPgoJPHBhdGggZD0iTTI2LjIsODguMmMzLjMsMiw2LjcsMy42LDEwLjIsNC43Yy0zLjUtNi4yLTYuMy0xMi42LTguOC0xOC41Yy0zLjEtNy4yLTUuOC0xMy41LTktMTcuMmMtMS45LDgtMiwxNi40LTAuMywyNC43ICAgQzIwLjYsODQuMiwyMy4yLDg2LjMsMjYuMiw4OC4yeiIvPgoJPHBhdGggZD0iTTMwLjksNzNjMi45LDYuOCw2LjEsMTQuNCwxMC41LDIxLjJjMTUuNiwzLDMyLTIuMyw0Mi42LTE0LjZDNjcuNyw3Niw1Mi4yLDY5LjYsMzcuOSw2MC43QzMyLDU3LDI2LjUsNTMsMjEuMyw0OC42ICAgYy0wLjYsMS41LTEuMiwzLTEuNyw0LjZDMjQuMSw1Ny4xLDI3LjMsNjQuNSwzMC45LDczeiIvPgo8L2c+Cjwvc3ZnPg==
由于 +
符号,您正在使用的代码将无法正确处理该模式:
const base64EncodedImageString = image.replace(
/^data:image\/\w+;base64,/,
""
);
请查看结果如何实际包含 data:image/svg+xml;base64,
信息作为前缀:
为了成功处理 SVG 用例,您可以将正则表达式修改为:
const base64EncodedImageString = image.replace(
/^data:image\/(\w|\+)+;base64,/,
""
);
请注意现在如何成功提取 base64:
如果内容类型未设置为 image/svg+xml
,请考虑将其更改为该值,它也可能会有所帮助。
关于node.js - Firebase存储使用云功能仅svg上传不起作用其他格式可以使用base64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70445309/