我正在使用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,
}))
同样,我不确定这是否是表单数据的问题,但如果我为表单数据提供filename
和knownLength
,这个问题就会消失。这是我的最终代码(稍作修改):
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
没有正确读取文件数据。设置filename
和knownLength
可以绕过这个问题。
更新:在form-data
的新版本中可能已经部分修复了这个问题。我更新了包,不再需要设置knownLength
。我仍然需要设置filename
。如果没有它,服务器认为文件是空的。