我正在从一个缓冲区上传一个文件,使用form-data..。在服务器端,我使用formidable解析文件数据。我一直在服务器上收到这样的错误:
Error: MultipartParser.end(): stream ended unexpectedly: state = START
或者
Error: MultipartParser.end(): stream ended unexpectedly: state = PART_DATA
我不确定这是表单数据的问题还是可怕的问题。我找到了很多解决方案(主要涉及不手动设置Content-Type头)。然而,我找不到一个为我解决这个问题的人。我最终弄明白了一些事情,所以为了回答而发帖。
我在开发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,
}))
发布于 2021-02-26 10:32:01
同样,我不确定这是表单数据的问题还是可怕的问题,但如果我提供一个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’)结果,但什么也得不到(没有中止)。
我试着设置filename
我得到了同样的错误。
我试着设置knownLength
。文件上传了,但它是空的(至少,formidable认为它是空的)。它必须需要文件名才能正确解析文件?
这可能是form-data
未正确读取输入流或未正确写入输出流(我确实注意到在查看服务器上的原始表单数据时,文件数据已被截断)或formidable
未正确读取文件数据。有一些关于设置filename
和knownLength
这就绕过了这个问题。
https://stackoverflow.com/questions/66379294
复制相似问题