"Error: MultipartParser.end(): stream ended unexpectedly" error when uploading a file

"Error: MultipartParser.end(): stream ended unexpectedly" error when uploading a file

我正在使用 form-data. On the server side I'm using formidable 从缓冲区上传文件以解析文件数据。我在服务器上不断收到这样的错误:

Error: MultipartParser.end(): stream ended unexpectedly: state = START

Error: MultipartParser.end(): stream ended unexpectedly: state = PART_DATA

我不确定这是 form-data 的问题还是可怕的。我找到了很多解决方案(主要涉及不手动设置 Content-Type header)。但是,我找不到能为我解决问题的人。我终于想通了一些东西,所以发帖以便回答。

我在开发 Strapi 上传提供程序时遇到了这个问题。 Strapi 提供有关需要上传到服务的文件的信息。文件内容作为缓冲区提供(出于某种原因)。这是我收到错误时的代码(稍作修改):

const form = new FormData()
form.append('file', Readable.from(file.buffer))
form.append('name', file.name)
form.append('hash', file.hash)
form.append('mime', file.mime)
form.on('error', () => abortController.abort())

return fetch(url, {
    method: 'post',
    body: form,
    signal: abortController.signal,
}))

同样,我不确定这是表单数据的问题还是可怕的问题,但是如果我向表单数据提供 filenameknownLength,问题就会消失。这是我的最终代码的样子(略有修改):

const fileStream = Readable.from(file.buffer)
const fileSize = Buffer.byteLength(file.buffer)

const abortController = new AbortController()

const form = new FormData()
form.append('file', fileStream, {filename: file.name, knownLength: fileSize})
form.append('name', file.name)
form.append('hash', file.hash)
form.append('mime', file.mime)
form.on('error', () => abortController.abort())

return fetch(url, {
    method: 'post',
    body: form,
    signal: abortController.signal,
}))

我已经尝试记录 form.on('error') 结果,但我什么也没得到(它没有中止)。

我试过只设置 filename 但我得到了同样的错误。

我试过只设置 knownLength。文件上传但它是空的(至少,强大的认为它是)。它必须需要文件名才能正确解析文件?

这可能是 form-data 没有正确读取输入流或没有正确写入输出流的问题(我确实注意到查看服务器上的原始表单数据时文件数据被截断了)或者 formidable 没有正确读取文件数据。设置 filenameknownLength 可以绕过这个问题。

更新: 这可能已在较新版本的 form-data 中部分修复。我更新了包,不再需要设置 knownLength。不过,我仍然需要设置 filename。没有它,服务器认为文件是空的。