Superagent .attach()文件或缓冲区数据为空

时间:2019-03-09 15:16:14

标签: node.js reactjs express 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,只是为了能够随同我的字段一起发送文件。 我已经看到一些类似的问题,但是似乎没有答案。

1 个答案:

答案 0 :(得分:0)

检查后

https://github.com/visionmedia/superagent/blob/master/lib/client.js#L571

显示超级代理具有自己的FormData变量,并将附加文件附加到该变量上-意味着我自己的FormData的使用是多余的,因此会导致嵌套,从而导致有效载荷为空。

>

因此,只需将类型inputFile的{​​{1}}传递到File就可以解决问题。

此外,对于这些领域,我有十二个解决方案:

.attach()

在后端服务器中,只需:.field('fieldName', JSON.stringify(body))即可获取JSON格式的请求有效负载。