当前位置: 首页 > 知识库问答 >
问题:

如何在Firebase Cloud功能中获取上传的图像链接?[副本]

陈野
2023-03-14

我有一个云函数,可以为上传的每个图像生成一组调整大小的图像。这是通过 onFinalize() 钩子触发的。

调整上传图像大小的云函数:

export const onImageUpload = functions
  .runWith({
    timeoutSeconds: 120,
    memory: '1GB'
  })
  .storage
  .object()
  .onFinalize(async object => {
    const bucket = admin.storage().bucket(object.bucket)
    const filePath = object.name
    const fileName = filePath.split('/').pop()
    const bucketDir = dirname(filePath)
    const workingDir = join(tmpdir(), 'resizes')
    const tmpFilePath = join(workingDir, fileName)

    if (fileName.includes('resize@') || !object.contentType.includes('image')) {
      return false
    }

    await fs.ensureDir(workingDir)

    await bucket.file(filePath).download({
      destination: tmpFilePath
    })

    const sizes = [
      500,
      1000
    ]

    const uploadPromises = sizes.map(async size => {
      const resizeName = `resize@${size}_${fileName}`
      const resizePath = join(workingDir, resizeName)

      await sharp(tmpFilePath)
        .resize(size, null)
        .toFile(resizePath)

      return bucket.upload(resizePath, {
        destination: join(bucketDir, resizeName)
      })
    })

    // I need to now update my Firestore database with the public URL.
    // ...but how do I get that here?

    await Promise.all(uploadPromises)
    return fs.remove(workingDir)
  })

这很好,也很有效,但是我还需要以某种方式检索这些图片的公共URL,以便将这些值写入我的Firestore。

我可以在前端使用< code>getDownloadURL()来完成这项工作,但是我不确定如何从新生成的图像的云函数中完成这项工作。

在我看来,这无论如何都需要在后端发生,因为我的前端无法知道图像何时被处理。

仅适用于客户端

const storageRef = firebase.storage().ref()
const url = await storageRef.child(`images/${image.name}`).getDownloadURL()

有什么想法吗?

回答(带警告):

下面@sergio从技术上正确地回答了这个问题,但我只想指出在它能够工作之前需要做的一些额外的事情。

> < li>

根据TypeScript,< code>getSignedUrl()的“expires”参数似乎必须是一个数字。因此,为了让它工作,我必须传递一个用纪元(毫秒)表示的未来日期,比如< code>3589660800000。

我需要将凭据传递给admin.initializeApp()才能使用此方法。您需要在Firebase管理员中生成服务号密钥。请参阅此处:https://firebase.google.com/docs/admin/setup?authuser=1

希望这也能帮助其他人。

共有1个答案

夏俊杰
2023-03-14

我相信从桶上传返回的promise包含对文件的引用,然后您可以使用它来获取签名的URL。

类似的东西(未经测试):

const data = await bucket.upload(resizePath, { destination: join(bucketDir, resizeName) });
const file = data[0];
const signedUrlData = await file.getSignedUrl({ action: 'read', expires: '03-17-2025'});
const url = signedUrlData[0];
 类似资料:
  • 我有一张图片上面有文字。我需要从图像中提取文本。 例如:假设我有一个图像,在图像之上我有一个标志“诺基亚”。我想从图像中提取作为文本的徽标。

  • 我是的新手。我想知道是否可以下载所有手动上传的图片?我搜索了这个主题,但我发现,我需要图像并将其保存在中,但在这种情况下,如果我以编程方式上传它。还有别的办法吗?因为我想手动上传。

  • 问题内容: 是否有显示大图像并允许用户放大和缩小和平移图像的通用方法? 到目前为止,我发现了两种方法: 覆盖ImageView,对于这样一个常见问题似乎有点过多。 使用网络视图,但对整体布局的控制较少等。 问题答案: 更新 我刚刚给TouchImageView进行了新的更新。现在,除了“平移”和“缩放”缩放外,还包括“双击缩放”和“缩放”。下面的代码是非常过时。您可以签出github项目以获取最新

  • 我正在尝试用WordPress高级自定义字段和repeater字段插件构建一个简单的图库。我需要显示一个缩略图,你点击放大主图像(我使用的是Fancybox)。有人知道WordPress自动生成的图像缩略图的链接是否可能吗? 我可以得到主要的图像链接: /wp-content/uploads/2014/12/slide1.jpg 但需要获取此图像链接: /wp-content/uploads/20

  • 我找了很久,但不幸的是一无所获,所以我问:我是怎么做到的? 我想改变我的网站的形象,如果你用skype或WhatsApp发送! [黄色框中的图片!]

  • 问题内容: 我已经阅读了有关如何使用OpenCV的基于HOG的行人检测器的文章: 如何使用OpenCV检测和跟踪人员? 我想使用HOG来检测图像中的其他类型的对象(不仅仅是行人)。但是, HOGDetectMultiScale 的Python绑定似乎无法提供对实际HOG功能的访问。 是否可以使用Python + OpenCV直接从任何图像中提取HOG功能? 问题答案: 如果您想要用于HOG功能的快