【问题标题】:parse form data zip file in cloud function在云功能中解析表单数据 zip 文件
【发布时间】:2020-02-05 07:52:39
【问题描述】:

我正在将 FormData() 发送到一个云函数,在 JavaScript 前端使用类似这样的东西。

//Frontend Angular
const formData = mew FormData();
formData.append('file1', zipFile1);
formData.append('file2', zipFile2);
formData.append('name', 'MyFiles');

this.http.post(urlAPI, formData) //angularJS


//Cloud Function
function main(param) {
   console.log(param);
}

param 上的控制台日志显示 content-typemultipart/form-data 在标题中。 还有一个标记为__ow_body 的属性。这个值是一个很长的字符串和数字。我不确定这是什么,但我假设它是以流/序列化格式发送的文件。

{
  __ow_body: 'hf381fh891hv831h93n19384v938v892vn98vn2890vn29n9vn9892vn948vn2893vn2985hv98...'
}

我想确认这是否是流数据,如果是,我该如何解析?

我需要将此文件(一个包含图像的 zip 文件)发送到我正在使用的 API。在此文档 API 中,示例显示在本地文件系统中发送文件,例如

someApiFunction('./myImgs.zip').then(...);

问题在于我通过 http 网络协议发送我的 zip 文件,我认为格式与在本地文件系统/机器中读取文件的示例非常不同。如何反序列化/或解析我的文件,以便将其识别为包含图片的 zip 文件?

我尝试使用fs.createReadStream,但它似乎没有解析它。它只会创建一个更结构化的对象,但在该对象中,我看不到我的 formData 及其键,例如 file1 file2name

我需要先在哪里写这个文件吗?

【问题讨论】:

  • 当从 formData 生成 JSON 时,它将变成一个空对象...{} - 在请求中结合 formData 和 JSON 似乎是一件奇怪的事情
  • 那么,如果我不将其设为 JSON,我该如何发送呢?

标签: javascript angular google-cloud-functions serverless ibm-cloud-functions


【解决方案1】:

即使可能性较小,您也可以尝试稍微改变一下您发布 formData 的方式。我找到了一个关于如何使用formData with Angular 的非常好的文档。正如那里所说,您可以尝试发布使用类似这样的内容:

  this.httpClient.post<any>(this.SERVER_URL, formData).subscribe(
  (res) => console.log(res),
  (err) => console.log(err)
); 

这不太可能奏效,但你可以试一试。

可以肯定的是,由于 Cloud Functions pre-processes some requests 的方式,您可以预期某些库无法工作,我认为这正是您的情况。

正如 Cloud Functions documentation 中所述,您需要使用请求的 rawBody 属性和“bus-boy”库来处理 multipart/form-data。

这是处理此类请求的code example 之一。

【讨论】:

    猜你喜欢
    • 2016-03-14
    • 2023-03-07
    • 2019-03-16
    • 2011-04-21
    • 2020-11-27
    • 2018-03-30
    • 2023-01-19
    • 2019-04-03
    • 2021-05-27
    相关资源
    最近更新 更多