Firebase Cloud Storage - 使用元数据上传 -

2024-05-24

我希望从浏览器上传带有元数据的文件,以便通过云功能正确识别和处理文件。

在客户端上,我的上传器代码如下所示:

    uploadTaskPromise: async function (file) {
      return new Promise((resolve, reject) => {      
        const storageRef = storage.ref();
        const myRef = storageRef.child(`myfolder/${my_file_name}.wav`);
        const metadata = {
          project_id: my_project_id
        };
       
        const uploadTask = myRef.put(file, { metadata: metadata });    
        uploadTask.on("state_changed",(snapshot) => {
          const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
          console.log("Upload is " + progress + "% done");            
         },   
         function error(err) {
           console.log("error", err);
           reject();
          }, 
          function complete() {
          uploadTask.snapshot.ref.getDownloadURL()
          .then(function (downloadURL) {
             resolve(downloadURL);
           });
         }    
       )
     });
   },

在服务器上(使用 Node js 的 Firebase Cloud Functions)

exports.uploadHandler = functions.storage.object().onFinalize(async (object) => { 
  const bucket = admin.storage().bucket(object.bucket);
  const metadata = await bucket.file(object.name).getMetadata()
  console.log("METADATA: " + JSON.stringify(metadata))
 
  // THIS IS WHERE I WANT TO HANDLE UPLOADS BASED ON THE METADATA
  
  return ({ message: "file uploaded" })
});

The uploadHandler正在工作 - 但是metadata is undefined, as is metadata.metadata

如何访问从客户端上传的元数据?


你们真的很亲密。根据API参考 https://firebase.google.com/docs/reference/js/v8/firebase.storage.Reference#put,第二个参数是UploadMetadata object https://firebase.google.com/docs/reference/js/v8/firebase.storage.UploadMetadata它有一个名为customMetadata https://firebase.google.com/docs/reference/js/v8/firebase.storage.UploadMetadata#optional-custommetadata.

因此,要更正您的代码,您需要换出

myRef.put(file, { metadata: metadata });

with

wmyRef.put(file, { customMetadata: metadata });

此外,您的进度逻辑不应调用resolve and reject就像现在一样——那就是反模式 https://stackoverflow.com/questions/23803743。你应该改为链接到UploadTask自己的 Promise API。

return wmyRef.put(file, { customMetadata: metadata })
  .then(
    (snapshot) => { // onComplete
      return snapshot.ref.getDownloadURL();
    },
    (err) => { // onError (although I would just omit this entirely)
      console.log("failed to upload", err);
      throw err;
    }
  );

使用您的原始代码,如果getDownloadURL()失败,其错误将不会被处理。

如果您仍然需要进度报告,请使用:

const uploadTask = wmyRef.put(file, { customMetadata: metadata });

uploadTask.on(
  "state_changed",
  (snapshot) => {
    const progress = (snapshot.bytesTransferred / snapshot.totalBytes) * 100;
    console.log("Upload is " + progress + "% done");            
  }
);

return uploadTask
  .then(snapshot => {
    console.log("Upload is complete");
    return snapshot.ref.getDownloadURL()
  });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firebase Cloud Storage - 使用元数据上传 - 的相关文章

随机推荐

  • 使用 php 将 swf 转为 pdf

    有没有办法使用 php 将 SWF 转换为 pdf 我的意思是该页面有一个按钮 单击它必须将 swf 内容导出为 pdf 格式 您可以尝试的一种方法是使用ffmpeg http www ffmpeg org 使用 image2 输出编解码器
  • Microsoft.NETCore.App 和 Microsoft.NETCore.Platforms 的传递依赖项如何工作

    我很难弄清楚传递依赖项的版本解析如何适用于框架 元包 我问的原因是 似乎每次我们引入 旧 依赖项时 例如指向的东西netstandard2 0或者 2 1 我们最终得到了一长串过时的包 我们的构建管道再次报告了这一点 举个例子 给定一个 n
  • Instagram 广场照片 API

    Instagram 会提供任何通过 API 抓取肖像 风景的方法吗 API 文档看起来没有改变 截至目前 他们仍然返回肖像图像的正方形尺寸 但 api 文档没有提供任何获取原始图像的方法 他们会继续返回方形图像吗 Instagram对此有何
  • 在 GWT 中使用 SVG

    我想知道是否可以在面板中包含 SVG 内容 或者在 GWT 中工作的任何内容 能够以编程方式向 SVG 添加更多内容 例如添加圆或曲线 并处理鼠标事件 这会是在 SVG 或 GWT 中 我尝试创建一个 HTML 对象 添加以下内容
  • 下界比较函数

    我有以下结构 enum quality good 0 bad uncertain struct Value int time int value quality qual class MyClass public MyClass Inser
  • Linux中使用管道进行进程间通信

    我已经编写了在 linux 中写入数字以进行管道传输的代码 如下所示 但显示错误 任何人都可以帮助我解决这个问题 基本上该程序的问题陈述如下 一个程序将打开一个管道 向管道写入一个数字 其他程序将打开同一管道 读取数字并打印它们 关闭两个管
  • 如何从现有存储库中的分支创建新的 GitHub 存储库?

    I have master and 新项目分支机构 现在我想创建一个全新的存储库及其基于新项目分支的主存储库 背景 我有一个存储库 其中包含三个独立的应用程序 事情并不是这样开始的 仓库中最初只有一个应用程序 然而 随着时间的推移 业务需求
  • Windows Azure 上的多租户应用程序

    我们想要创建具有共享数据库表结构的多租户应用程序 目前 使用标准 SQL Server 我们可以通过为每个表提供 TenantID 来实现这一点 我们能否在 Windows Azure 上实现相同的目标 但无需 TenantID 此致 阿列
  • 连接管理 ASP.net

    如何管理 ASP Net 应用程序中的数据库连接 我的理解告诉我 最好 的方法是打开连接 进行查询 关闭连接 并多次执行此操作 因为连接池使成本可以忽略不计 当我有一个 DAL 时 问题就出现了 其中每个方法都管理自己的连接 例如 User
  • Azure B2C 中的 KMSI 实际上有什么作用?

    我们提供了此文档 说明如何使用自定义策略设置 保持登录状态 KMSI https learn microsoft com en us azure active directory b2c custom policy keep me sign
  • Doctrine - 使用查询生成器时如何水合集合

    A 我问的上一个问题 https stackoverflow com questions 27572139 doctrine how to extract results and their relationships as array 2
  • 如何使用Google API PHP SDK获取用户信息

    我正在尝试为拥有 Google 帐户的用户添加登录选项到我的网站 我已经能够实现这个 Facebook 但在使用 Google 获取用户帐户信息时遇到问题 我正在使用位于此处的 Google PHP SDK https github com
  • iOS 9 + Xcode 7 的 Segue 上的应用程序导致整个设备崩溃

    更新 我已经在这一年中使用了我的一个 DTS 目前与 Apple 支持工程师合作 根据他的建议 我还为此创建了一个错误报告 随着时间的推移 我将更新此线程 希望能产生最终的解决方案 不知何故 我找到了一种方法来创建一个可以真正重新启动模拟器
  • 如何使用 blazor 前端 http 请求附加令牌

    我使用 blazor 作为前端 api 已完成 JWT 配置 前端可以创建用户帐户并登录API 但现在我的前端httpclient没有设置JWT令牌 所以如果我在Api控制器中设置 授权 前端将无法访问它 api程序代码如下 builder
  • UITableview Cell 异常 - '必须将自动调整大小掩码转换为约束才能具有 _setHostsLayoutEngine:YES

    我正在使用 UITableView CategoryCell cell tableView dequeueReusableCellWithIdentifier CellIdentifierLink 这是我收到错误的行 它在 IOS 7 中工
  • MS Batch:检查驱动器是否正在使用

    我需要检查驱动器 Z 是否正在使用 例如 正在由应用程序使用 已打开 我的批处理文件如下所示 Mount Z wait 15 minutes check if drive Z is in use IF NOT unmount Z ELSE
  • 聚合物中的主机属性和属性有什么区别?

    我正在从 0 5 迁移到 1 0 在阅读时 我注意到声明属性有两种不同的方式 使用hostAttributes and properties 这两个有什么区别 宿主属性是与元素相应的 Javascript 属性 您在其中声明的 不匹配的属性
  • 使用 libpqxx 批量存储数据或如何在 libpqxx 中使用 COPY 语句

    要在 PostgreSQL 中插入批量数据 填充数据库 最快的方法是使用 COPY Source https stackoverflow com questions 758945 whats the fastest way to do a
  • Wikipedia API:如何获取页面的修订次数?

    有人知道如何使用 mediawiki API 获取维基百科页面的修订次数吗 我已经阅读了这个API文档 但找不到相关的API 修订API http www mediawiki org wiki API Properties revision
  • Firebase Cloud Storage - 使用元数据上传 -

    我希望从浏览器上传带有元数据的文件 以便通过云功能正确识别和处理文件 在客户端上 我的上传器代码如下所示 uploadTaskPromise async function file return new Promise resolve re