上传文件时出现"Error: MultipartParser.end(): stream ended unexpectedly"错误



我正在使用form-data从缓冲区上传文件。在服务器端,我使用强大来解析文件数据。我一直在服务器上得到这样的错误:

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

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

我不确定这是表单数据的问题还是可怕的问题。我找到了很多解决方案(主要涉及不手动设置Content-Type头)。然而,我找不到一个可以解决我的问题。我最后弄明白了一些事情,所以发帖来回答。

我在开发Strapi上传提供程序时遇到了这个问题。Strapi提供有关需要上传到服务的文件的信息。文件内容作为Buffer(出于某种原因)提供。下面是我的代码看起来像当我得到错误(稍微修改):

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。如果没有它,服务器认为文件是空的。

相关内容

  • 没有找到相关文章

最新更新