Superagent .attach() 文件或缓冲区数据为空
Superagent .attach() file or buffer data is empty
我 运行 解决了这个问题,其中 superagent 没有正确地将文件或缓冲区附加到请求中,我提到空的原因是由于表单数据看起来像:
------WebKitFormBoundaryy6T3XReWRFT1KfFm
Content-Disposition: form-data; name="media"
------WebKitFormBoundaryy6T3XReWRFT1KfFm--
文件中没有任何信息,显示为空 media:
我使用的代码很简单:
.post(`${API_ROOT}${url}`)
.withCredentials()
.attach('media', body.media, 'filename.jpg')
其中 body.media
是:
asBuffer(file, callback) {
const reader = new FileReader();
reader.addEventListener('load', () => callback(reader.result));
reader.readAsDataURL(file);
}
asBuffer(file, ((b) => {
body.media = b;
}));
或
body.media = new FormData();
body.media.append('file', inputFile, inputFileName);
或在 asBuffer
之后
Buffer.from(body.media, 'base64');
其中 inputFile
的类型为 File
。
我也玩过 attach
并在 body.media
不是 Buffer
.
类型时省略了文件名
我认为我这边没有问题,因为使用 .send(body.media)
实际上将文件附加到请求表单数据,我可以在后端服务器中看到它。只有 .attach()
功能无法正常工作,我需要它,因为我还需要发送字段。
目前我找到的唯一解决方法是:
const mediaFile = body.media;
delete body.media;
.post(...)
.withCredentials()
.query(body)
.send(mediaFile)
而且我实际上并不觉得得到一个巨大的 url 只是为了能够与我的字段一起发送文件。
我已经看到过一些像这样的问题,但 none 似乎已经有了答案。
检查后
https://github.com/visionmedia/superagent/blob/master/lib/client.js#L571
表明 superagent 有自己的 FormData
变量,它会将附加文件附加到该变量 - 这意味着使用我自己的 FormData
是多余的,因此会导致嵌套,从而导致空负载。
因此只需将 File
类型的 inputFile
传递给 .attach()
即可解决问题。
此外,对于这些字段,我有十几个解决方案是:
.field('fieldName', JSON.stringify(body))
并且在后端服务器中只需:JSON.parse(req.body.fieldName)
以 JSON 格式获取请求负载。
我 运行 解决了这个问题,其中 superagent 没有正确地将文件或缓冲区附加到请求中,我提到空的原因是由于表单数据看起来像:
------WebKitFormBoundaryy6T3XReWRFT1KfFm
Content-Disposition: form-data; name="media"
------WebKitFormBoundaryy6T3XReWRFT1KfFm--
文件中没有任何信息,显示为空 media:
我使用的代码很简单:
.post(`${API_ROOT}${url}`)
.withCredentials()
.attach('media', body.media, 'filename.jpg')
其中 body.media
是:
asBuffer(file, callback) {
const reader = new FileReader();
reader.addEventListener('load', () => callback(reader.result));
reader.readAsDataURL(file);
}
asBuffer(file, ((b) => {
body.media = b;
}));
或
body.media = new FormData();
body.media.append('file', inputFile, inputFileName);
或在 asBuffer
Buffer.from(body.media, 'base64');
其中 inputFile
的类型为 File
。
我也玩过 attach
并在 body.media
不是 Buffer
.
我认为我这边没有问题,因为使用 .send(body.media)
实际上将文件附加到请求表单数据,我可以在后端服务器中看到它。只有 .attach()
功能无法正常工作,我需要它,因为我还需要发送字段。
目前我找到的唯一解决方法是:
const mediaFile = body.media;
delete body.media;
.post(...)
.withCredentials()
.query(body)
.send(mediaFile)
而且我实际上并不觉得得到一个巨大的 url 只是为了能够与我的字段一起发送文件。 我已经看到过一些像这样的问题,但 none 似乎已经有了答案。
检查后
https://github.com/visionmedia/superagent/blob/master/lib/client.js#L571
表明 superagent 有自己的 FormData
变量,它会将附加文件附加到该变量 - 这意味着使用我自己的 FormData
是多余的,因此会导致嵌套,从而导致空负载。
因此只需将 File
类型的 inputFile
传递给 .attach()
即可解决问题。
此外,对于这些字段,我有十几个解决方案是:
.field('fieldName', JSON.stringify(body))
并且在后端服务器中只需:JSON.parse(req.body.fieldName)
以 JSON 格式获取请求负载。