如何解析 firebase 云函数上的多部分/表单数据?

2024-03-16

根据此处的文档,我一直在尝试将带有文本和图像文件的多部分/表单数据对象发布到我的云功能之一:

https://cloud.google.com/functions/docs/writing/http#multipart_data_and_file_uploads https://cloud.google.com/functions/docs/writing/http#multipart_data_and_file_uploads

我的云函数几乎与示例完全相同,只是我将其包装在 CORS 响应中。但似乎无论如何,busboy 的“field”和“file”事件都不会触发,当我打印请求正文的 toString 方法时,我会在数据变成乱码之前获取一些数据。

发送 FormData 时是否有可能我设置不正确?

这是包含我的 XMLHttpRequest() 的代码:

var formData = new FormData(document.getElementById("ticketForm"));
return new Promise(function (resolve, reject) {
      var xmlhttp = new XMLHttpRequest();
      xmlhttp.open("POST", "https://us-central1-XXXXXXX.cloudfunctions.net/ticketFunction");
      var boundary = Math.random().toString().substr(8) + "--";
      xmlhttp.setRequestHeader('Content-Type', 'multipart/form-data;charset=utf-8; boundary=' + boundary);
      // xmlhttp.setRequestHeader('Content-Type', undefined);

      xmlhttp.onload = function () {
        if (this.status >= 200 && this.status < 300) {
          resolve(xmlhttp.response);
        } else {
          reject({
            status: this.status,
            statusText: xmlhttp.statusText
          });
        }
      };
      xmlhttp.onerror = function () {
        reject({
          status: this.status,
          statusText: xmlhttp.statusText
        });
      };
      xmlhttp.send(formData);
    });

这是我的云功能:

Exports.newTicketWithPhoto = 函数.https.onRequest((req, res) => { cors(请求, res, () => {

if (req.method === 'POST') {

  const busboy = new Busboy({ headers: req.headers });
  const tmpdir = os.tmpdir();
  console.log("Length: " + req.headers['content-length']);
  console.log(req.body.toString());

  // This object will accumulate all the fields, keyed by their name
  const fields = {};

  // This object will accumulate all the uploaded files, keyed by their name.
  const uploads = {};

  // This code will process each non-file field in the form.
  busboy.on('field', (fieldname, val) => {
    // TODO(developer): Process submitted field values here
    console.log(`Processed field ${fieldname}: ${val}.`);
    fields[fieldname] = val;
  });

  busboy.on('error', function(err){
    console.log("Error: " + err);
  });

  // This code will process each file uploaded.
  busboy.on('file', (fieldname, file, filename) => {
    // Note: os.tmpdir() points to an in-memory file system on GCF
    // Thus, any files in it must fit in the instance's memory.
    console.log(`Processed file ${filename}`);
    const filepath = path.join(tmpdir, filename);
    uploads[fieldname] = filepath;
    file.pipe(fs.createWriteStream(filepath));
  });

  // This event will be triggered after all uploaded files are saved.
  busboy.on('finish', () => {
    // TODO(developer): Process uploaded files here
    console.log(fields);
    console.log("Uploads: " + JSON.stringify(uploads));
    for (const name in uploads) {
      console.log(name);
      const file = uploads[name];
      fs.unlinkSync(file);
    }
    res.send();
  });

  req.pipe(busboy);
} else {
  // Return a "method not allowed" error
  res.status(405).send("Something weird happened");
}

}) });

我注意到的几件事是: 打印标头的内容长度值似乎总是返回未定义。

当我打印 req.body.toString() 方法时,我得到:

 ------WebKitFormBoundaryeYZHuHsOLlohyekc
Content-Disposition: form-data; name="description"

testing description
------WebKitFormBoundaryeYZHuHsOLlohyekc
Content-Disposition: form-data; name="priority"

Low
------WebKitFormBoundaryeYZHuHsOLlohyekc
Content-Disposition: form-data; name="dueDate"

2018-07-27
------WebKitFormBoundaryeYZHuHsOLlohyekc
Content-Disposition: form-data; name="customer"

zavtra
------WebKitFormBoundaryeYZHuHsOLlohyekc
Content-Disposition: form-data; name="email"

[email protected] /cdn-cgi/l/email-protection
------WebKitFormBoundarysseArmLvKhJY0TAm
Content-Disposition: form-data; name="photo"; filename="brighthabits1.png"
Content-Type: image/png

�PNG

IHRGB���@IDATx�}�ݴտ��I�$�V���*�EH ! �:(_7m)-ݻ�ί���{-dCaf��*�=!����N����ͽ�ږm�y�׶tt�OG�ʶ,6L���L*�ć[����V;�x�+[�c�/�0;@a�5��;��]]<x��\R�cqoG`rGƵ�t����O�y�J���"
����*�,�F,��.�ib�
                 ��I�.�SV�;��h�!v��~T�EY����(u\�4+&��I��9@~wP�`N��H�;�G"7.BI��h
                                                                               P��$R
                                                                                    �0pt,�[=��E��8����$^$��
"�,�,�4�>�Y�YY|�v3JSW��
                       )�q,���i>w��A��q\-
                                         �u���ՠ�hJW�oF������W7X��]��
                                                                    )#mx������&�њ�����iu���;D��ŗL��ޥh[F�8���D�^������IW��#��

                                �
                                 �
�TL�n���� {�l�`h����r   ��S>�[���&���_�%R8���W��mok�E����R���.]#@5������j���o���e����?Ӟ�u�Ţ�Y��5�N'�Nf��Թ#ߏ��E;�<�?^X��x�uπʭ�V??�� s�plzBǶ 

我不确定最后导致所有乱码的原因是什么,但这只有在我上传图像时才会明确。当表单数据中没有图像时,busboy 的“field”事件仍然不会触发,这让我相信有些东西仍然没有被正确解析。

这很令人沮丧,因为否则看起来我完全正确地遵循了文档。


// Node.js doesn't have a built-in multipart/form-data parsing library.
// Instead, we can use the 'busboy' library from NPM to parse these requests.
const Busboy = require("busboy")
const busboy = new Busboy({ headers: request.headers })
let fields = []
busboy.on("field", (field, val) => {
    console.log(`Processed field ${field}: ${val}.`)
    fields[field] = val
})
busboy.end(request.rawBody)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解析 firebase 云函数上的多部分/表单数据? 的相关文章

  • 从脚本内更改自动热键托盘图标

    如何从 Autohotkey 脚本中将托盘图标更改为 my ico 例如 当脚本暂停时 为此 我在托盘菜单中提出了自己的 暂停脚本 菜单项 SingleInstance ignore Menu Tray Tip AutoCase 0 11
  • IE9-11 检测变换样式:preserve-3d

    我为一个项目制作了一个 3d 类型的菜单 自然 IE 会引起问题 因为 IE10 即使 3d 变换工作 也不支持变换样式 preserve 3d 我尝试了解决方法 通过对 3d 菜单容器的每个子元素应用变换 但至少可以说 动画看起来很糟糕
  • 我们什么时候应该在 Django 中使用“db_index=True”?

    当我们应该定义db index True在模型字段上 我正在尝试优化应用程序并且我想了解更多信息db index 什么情况下我们应该使用它 文档说使用db index True在模型字段上用于加速查找 但在存储和内存方面略有缺点 我们应该使
  • Android Espresso 单击按钮时出现错误

    我正在尝试使用 espresso 框架为 Android 应用程序编写一些 UI 测试 现在我只是检查启动屏幕上是否存在所有元素 然后尝试单击登录按钮 单击按钮时 测试由于错误而失败 我似乎无法理解为什么会发生这种情况 我的测试代码是 Ru
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • bash:gitolite:找不到命令

    我正在尝试使用 Gitolite 在 Gitlab 中创建一个新分支 我完成安装步骤 当我遇到 设置 gitolite 部分时 我遇到了麻烦 我跟着这个link http sitaramc github com gitolite setup
  • ASP.NET Core MVC 视图组件搜索路径

    在此处的文档中 https learn microsoft com en us aspnet core mvc views view components view aspnetcore 2 2 https learn microsoft
  • xsi:type 属性搞乱了 C# XML 反序列化

    我使用 XSD exe 根据 XML 架构 xsd 文件 自动生成 C 对象 我正在反序列化 OpenCover 输出 但其中一个部分类未正确生成 这是导致异常的行
  • 一些基本的 PHP 问题 [已关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我只是有一些基本的 php 问题来加深我对学习的理解 但我找不到简单的答案 我有一个 php ajax 应用程序 它生成 mysql
  • If else 在 Web 网格列中

    如何在 webgrid 列中添加条件 if else grid GetHtml tableStyle table table bordered columns grid Columns grid Column RealName Name g
  • Azure Functions 计时器触发器线程安全

    我想知道是否有人知道如果您在 Azure 函数上设置了 Cron 设置 如果其任务执行时间超过 5 分钟 则每 5 分钟运行一次 会发生什么情况 它备份吗 或者我应该实现一个锁定功能 以防止某些东西 例如在循环中 处理先前调用已经处理的数据
  • SimpleIoC - 在缓存中找不到类型:Windows.UI.Xaml.Controls.Frame

    第一次由 SimpleIoC 实例化我的 ViewModel 时 我遇到了以下错误 我相信我已经按应有的方式设置了容器 但由于某种原因 我仍然收到以下错误 任何想法或帮助将非常感激 Microsoft Practices ServiceLo
  • 将 Angular Web 组件 EventEmitter 监听到 javascript

    我在以下工具的帮助下创建了一个小型网络组件本文 https medium com IMM9O web components with angular d0205c9db08f使用角度元素 其中包括 Input and Output 我能够将
  • svn 强制迁移

    我正在考虑将我们的 svn 代码库迁移到 perforce 看看谷歌搜索结果 我确实找到了两个具有相同功能的工具 P4转换ftp ftp perforce com pub perforce tools p4convert docs inde
  • java'assert'和'if(){}else exit;'之间的区别

    java和java有什么区别assert and if else exit 我可以用吗if else exit代替assert 也许有点谷歌 您应该记住的主要事情是 if else 语句应该用于程序流程控制 而assert 关键字应该仅用于
  • R闪亮:使用闪亮的JS从数据表中获取信息

    我想读出所有列名称以及它们在数据表中显示的顺序 由于不同的原因 我无法使用 stateSave 等选项 我对 JS 没有什么把握 但我确信用它可以完成 所以我需要你帮助我 我尝试过类似的代码片段 datatable data callbac
  • React 错误:目标容器不是 DOM 元素

    我刚刚开始使用 React 所以这可能是一个非常简单的错误 但我们开始吧 我的html代码非常简单 load staticfiles
  • 计算包含字母/数字的行数

    我想要实现的目标很简单 但是解释起来有点困难 我不知道在 postgres 中这是否真的可能 我处于相当基础的水平 SELECT FROM WHERE LEFT JOIN ON HAVING 等等基本的东西 我正在尝试计算包含特定字母 数字
  • Java 和/C++ 在多线程方面的差异

    我读过一些提示 多线程实现很大程度上取决于您正在使用的目标操作系统 操作系统最终提供了多线程能力 比如Linux有POSIX标准实现 而windows32有另一种方式 但我想知道编程语言水平的主要不同 C似乎为同步提供了更多选择 例如互斥锁
  • 如何使用 dql 从数据表中获取唯一值?

    我有一个表 其中有一列存储了各种值 我想使用 dql 从该表中检索唯一值 Doctrine Query create gt select rec school gt from Records rec gt where rec city ci

随机推荐

  • Kotlin 中的静态扩展方法

    如何在 Kotlin 中定义静态扩展方法 这可能吗 我目前有一个扩展方法 如下所示 public fun Uber doMagic context Context 可以在实例上调用上述扩展 uberInstance doMagic cont
  • 如何让我的设备振动?

    我正在使用 AS3 为 Android 制作 Flash 游戏 我希望用户知道他通过使设备振动一秒钟来按下按钮 有人可以向我解释如何才能做到这一点吗 我是否需要导入特定的类以及代码应该是什么样子 提前致谢 要使用振动扩展 AIR 应用程序将
  • ASP.NET MVC 单向路由

    是否可以在 Asp net MVC 的 RouteCollection 中定义一个路由 以便它只执行 URL 重写 部分并忽略 Html Actionlink 的 URL 生成 事实上 我想在控制器和操作之间添加一个关键字 控制器 关键字
  • 如何在没有 XIB 的情况下将选项卡栏添加到现有视图控制器

    I m 尝试避免使用 Interface Builder越多越好 目前 我通过代码创建了视图控制器 并通过代码更改了视图 我现在需要其中一个步骤将应用程序发送到一个新的观点标签栏 这也将使我改变观点 理想情况下 我要做的就是告诉当前视图控制
  • 如何保持React状态与MySQL数据库同步

    Scene 我正在构建一个简单的日历 Web 应用程序 它使用 React 作为前端 使用 MySQL 作为服务器后端 该应用程序在首次安装时从服务器检索所有事件的列表 将它们显示给用户并允许进行 CRUD 操作 一切都按预期进行 Ques
  • 从 ExtJS 请求到 node.js 时出现 CORS 问题。请求或响应标头不正确?

    我在网络内两个不同域之间向 Nodejs 服务器发出 ExtJS AJAX 请求时遇到问题 非常感谢任何帮助 当尝试从 ExtJS 客户端的 http 和 https 时 响应失败 但我本地的 Curl 通过 http 返回 200 OK
  • 在.NET / Visual Studio中定义TRACE常量

    在 Visual Studio 2010 中 如果您转到项目的属性并转到 生成 选项卡 则会有一个 定义 TRACE 常量 复选框 这相当于执行 define TRACE System Diagnostics Trace 的所有方法都有一个
  • 如何在 Android 中发送 vcard/contacts/?vcf var SMS 或 MMS?

    我想修改可以发送 contacts vcard vcf 文件 的Android源代码 彩信或短信 Android默认方式是通过蓝牙 我找了很多方法 但都行不通 我知道vcf格式是这样的 BEGIN VCARD VERSION 2 1 N l
  • 如何为 HPA 自动缩放指标启用 KubeAPI 服务器

    我使用的是 Kube 版本 v1 13 0 由于 Heapster 从 v1 11 开始就被贬值了 所以我一直坚持启用集群 Metrics 的 API 服务器来实现 HPA root kubectl get pods deployment
  • 安装 JSTL 会导致 org.xml.sax.SAXParseException: Prolog 中不允许内容

    在我的应用程序中 我使用 JSTL 但是当我在 Tomcat 中部署应用程序时 出现以下错误 SEVERE Parse Fatal Error at line 1 column 1 Content is not allowed in pro
  • ImportError:无法从“google.cloud”导入名称“tasks_v2”

    我正在尝试使用 GCP 文档中提供的 Google Cloud Tasks 代码示例 https cloud google com tasks docs creating http target tasks https cloud goog
  • Python 的 csv.reader(filename) 真的返回列表吗?看来并非如此

    所以我仍在学习Python 并且今天正在学习如何读取文件 csv 文件 我刚刚观看的课程告诉我 使用 csv reader filename 返回一个列表 所以我写了下面的代码 import csv my file open file na
  • 如何用PHP制作计算器?

    我想使用 PHP 来计算简单的代数表达式 例如 8 5 1 通过输入
  • iOS 11(Beta)中的webKit支持WebRTC吗?

    我有一个 URL 可以在 iOS11 测试版 上的 Safari 上正常工作 音频 视频也可以正常工作 但是 当我使用 WKWebView 加载此 URL 时 它会给我一个错误 不兼容的浏览器 当我在 WebKit 中检查浏览器版本时 它会
  • 批处理文件命令 PAUSE 不起作用

    我正在创建一个简单的批处理文件来帮助完成一些事情 并且我还打印了一些说明 我希望用户在退出之前看到这些说明 目前 窗口关闭得很快 所以我添加了PAUSE在文件末尾 但它不想工作 我查看了有关 SO 的其他问题 并检查以确保行结尾是CRLF我
  • 实体框架中的类和接口层次结构?

    我有两个相关的类 它们共享一个公共接口 并且都存储在同一个基础数据库表中 然而 实体框架生成一个公共类 而我确实需要两个不同的类 我该如何解决这个问题 最好使用基类而不是接口吗 如何更改 EF 模型以提供映射到一张表的两个类 Edit Ac
  • 用于获取虚拟访客所有者的 Softlayer API

    是否有任何 API 可以获取虚拟访客的所有者 已配置虚拟访客的用户 我只能看到有权访问虚拟访客 API 的用户 Thanks 请使用过滤器尝试以下请求 https username apikey api softlayer com rest
  • 模板函数只匹配某些类型?

    我想定义一个函数模板 template
  • 跳过 mysql 中重复条目的插入

    我有一个最喜欢的表 其中包含一些字段 例如login id driver id 一个login id可能有许多driver id 然后我使用批量更新 没有任何检查 driver id 是否存在于表中 输入数据将是驱动程序 id 的集合 如果
  • 如何解析 firebase 云函数上的多部分/表单数据?

    根据此处的文档 我一直在尝试将带有文本和图像文件的多部分 表单数据对象发布到我的云功能之一 https cloud google com functions docs writing http multipart data and file