Javascript Firebase功能-上载到存储时调整和覆盖现有图像

Javascript Firebase功能-上载到存储时调整和覆盖现有图像,javascript,firebase,firebase-storage,google-cloud-functions,Javascript,Firebase,Firebase Storage,Google Cloud Functions,因此,我遵循了创建云存储触发Firebase函数的步骤,该函数将根据上传的图像创建调整大小的缩略图,并将它们上传到存储。这里是简化的: exports.generateThumbnail = functions.storage.object().onChange(event => { // get the uploaded file data (bucket, name, type...) // return if the file is not an image or

因此,我遵循了创建云存储触发Firebase函数的步骤,该函数将根据上传的图像创建调整大小的缩略图,并将它们上传到存储。这里是简化的:

exports.generateThumbnail = functions.storage.object().onChange(event => {

    // get the uploaded file data (bucket, name, type...)

    // return if the file is not an image or name begins with "thumb_"

    // download the uploaded image in a temporary local file,
    // resize it using ImageMagick
    // upload it to storage with the name "thumb_<filename>"

}
exports.generateThumbnail=functions.storage.object().onChange(事件=>{
//获取上传的文件数据(bucket、name、type…)
//如果文件不是图像或名称以“thumb\”开头,则返回
//将上传的图像下载到临时本地文件中,
//使用ImageMagick调整其大小
//将其上载到名为“thumb_”的存储器
}
然而,当新的缩略图上传时,函数会在循环中再次触发,以此类推。他们通过返回上传的文件是否有“thumb_”前缀来避免这种情况

然后,您将得到两个图像(原始图像和缩略图),我想用缩略图重写现有图像,因此我只有一个具有原始路径的图像


我不知道该怎么做,因为我不知道如何在不更改名称的情况下避开reupload循环。我可以在上传缩略图后删除原始图像,但指向原始图像的链接已经返回并保存在实时数据库中(这些图像是供用户使用的配置文件图片).

在查看了
@google cloud/storage
npm模块中的
bucket.js
文档后,我终于成功地用缩略图覆盖了原始文件/路径,并避免了循环

可以在上传缩略图时附加自定义元数据,并在下次函数触发时测试该元数据

我将只发布我所做的更改,其余更改与链接示例中的更改相同

以下是测试:

const filePath = event.data.name
const metadata = event.data.metadata

if (metadata.isThumb) {
    console.log('Exiting: Already a thumbnail')
    return
}
下面是
spawn
承诺返回时的部分:

    return spawn(/* ... */)
}).then(_ => {
    console.log('Thumbnail created locally.')
    metadata.isThumb = true  // We add custom metadata
    const options = {
        destination: filePath,  // Destination is the same as original
        metadata: { metadata: metadata }
    }
    // We overwrite the (bigger) original image but keep the path
    return bucket.upload(/* localThumb */, options)
})

你只想在存储器中存储缩略图?@BrunoFerreira是的,我只想要缩略图,但我希望它在存储器中具有原始图像的路径,基本上覆盖原始数据。你可以尝试获取原始图像的路径,将缩略图上载到原始图像的路径,并删除原始图像,例如,如果原始图像最终路径是…/images如果您想显示更多内容,可以创建缩略图上传到…/images路径并删除原始图像。我可以创建一个答案。@Brunofereira我不确定我们是否了解对方,此功能在原始图像之后触发(比如/avatars/zantsu.jpg)上传,这个函数创建一个调整大小的图像,并将数据上传到/avatars/thumb_zantsu.jpg,如果我删除前缀并将thumb上传到/avatars/zantsu.jpg,这将成功覆盖图像,但随后该函数再次触发,我不知道如何退出,因此它不会再次开始重新上传。您可以获得/avatars/zantsu.jpg创建一个缩略图avatars/thumb_zantsu.jpg上传缩略图,这样/avatars/path有两个图像thumb和original,当上传的缩略图成功时,你删除了original/avatars/zantsu.jpg,而avatars/thumb_zantsu.jpg只保留缩略图,是不是我说了一百万,我也在寻找一个覆盖图片的方法,您的解决方案非常有效!干杯!