将一个包含文件的FormData嵌套对象追加到另一个FormData中

4

我需要向服务器发出 PATCH 请求,该请求期望一个非常具体的请求格式。类似于这样:

{
  file: MY_FILE_OBJECT
  name: 'Name',
  nestedObject: {
    nestednestedObject1: {
      name: 'Some other name'
    },
    nestednestedObject2: {
      name: 'Yet another name'
    },
  }
}

因为我需要能够传入一个文件,所以我必须将其转换为一个FormData对象。因此,对于主要字段来说,构建请求体是非常简单的。
const data = new FormData()
data.append('file', file, file.name)
data.append('name', 'Name')

然而,我该如何做嵌套的 translation 对象呢?我在另一个线程中看到了建议让我做一个 blob。应该是这样的:
const fullPatchObject = {
  nestedObject: {
    nestednestedObject1: { name: 'Some other name' }
    nestednestedObject2: { name: 'Yet another name' }
  }
}
const blob = new Blob([JSON.stringify(fullPatchObject)], { type: 'application/json' })
data.append('nestedObject', blob)

然而,这并不起作用。我在服务器上使用multer来处理文件,我得到了以下错误对象:

name: 'MulterError',
message: 'Unexpected field',
code: 'LIMIT_UNEXPECTED_FILE',
field: 'nestedObject'

请记住,如果我不使用嵌套对象,则所有内容都按预期工作,包括我尝试进行PATCH的文件和字段。问题似乎是multer认为我的“nestedObject”也可能是一个文件?事实是... 呃... 它不是,我只想将其作为字段传递,就像“name”字段一样。 我错过了什么吗?有什么方法可以使用“FormData”发送嵌套对象吗?
1个回答

12

尝试使用数组形式的名称:

data.append("nestedObject[nestedNestedObject1][name]", "Some other name");
data.append("nestedObject[nestedNestedObject2][name]", "Yet another name");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接