javascript - 在上传到 Firebase 时调整大小或压缩图像
问题描述
以下谷歌云功能正确上传图片,但我也想压缩图片以避免由于上传大文件而产生不必要的费用。任何建议将不胜感激!!!代码如下:
exports.uploadImage = (req, res) => {
const BusBoy = require("busboy")
const path = require("path")
const os = require("os")
const fs = require("fs")
const busboy = new BusBoy({ headers: req.headers })
let imageToBeUploaded = {}
let imageFileName
busboy.on("file", (fieldname, file, filename, encoding, mimetype) => {
if (mimetype !== `image/jpeg` && mimetype !== `image/png`) {
return res.status(400).json({ error: `Not an acceptable file type` })
}
// my.image.png => ['my', 'image', 'png']
const imageExtension = filename.split(".")[filename.split(".").length - 1]
// 32756238461724837.png
imageFileName = `${Math.round(
Math.random() * 1000000000000
).toString()}.${imageExtension}`
const filepath = path.join(os.tmpdir(), imageFileName)
imageToBeUploaded = { filepath, mimetype }
file.pipe(fs.createWriteStream(filepath))
})
busboy.on("finish", () => {
admin
.storage()
.bucket(config.storageBucket)
.upload(imageToBeUploaded.filepath, {
resumable: false,
metadata: {
metadata: {
contentType: imageToBeUploaded.mimetype
}
}
})
.then(() => {
const imageUrl = `https://firebasestorage.googleapis.com/v0/b/${config.storageBucket}/o/${imageFileName}?alt=media`
return db.doc(`/users/${req.user.uid}`).update({ imageUrl })
})
.then(() => {
return res.json({ message: "image uploaded successfully" })
})
.catch(err => {
console.error(err)
return res.status(500).json({ error: "something went wrong" })
})
})
busboy.end(req.rawBody)
}
解决方案
您可以在客户端设置最大文件大小并在提交前进行验证。目前,任何人都可以启用扩展程序(在 Firebase 控制台菜单上)以自动调整上传到项目的 firebase 存储桶的任何图像的大小。您只需在调整大小完成后选中删除原始文件的选项。更多信息:https ://firebase.google.com/products/extensions/storage-resize-images
推荐阅读
- php - 此集合实例上不存在属性 [id] [details] [details] [amount]
- internet-explorer - iframe 未加载具有相同域名的页面
- react-native - undefined 不是对象(评估 'object.keys(routeConfigs)')
- python - Elasticsearch解析异常400
- c++ - 优化/减少if语句中的条件表达式
- azure-devops - 发布代理运行的 Powershell 脚本抛出异常,因为缺少 .net 标准 2.0
- flutter - 不要在 toJson() 中解析空值
- c++ - 确定 IShellItemArray 中的所有项目是否来自同一目录
- c# - '当前的 SynchronizationContext 不能用作 TaskScheduler。' 在控制台应用程序中
- google-analytics - 子句嵌套的 BigQuery 与预期不符