使用表单数据和 axios 发送文件

Posted

技术标签:

【中文标题】使用表单数据和 axios 发送文件【英文标题】:Send file with form-data and axios 【发布时间】:2020-11-14 19:28:48 【问题描述】:

我正在尝试将视频发送到视频网站,我可以使用 REST api 和邮递员上传视频,所以我知道 api 可以按预期工作。现在我想使用 axios 做同样的请求。我的代码类似于如何使用表单数据和 axios 的示例:

const form = new FormData();
const stream = fs.createReadStream(PATH_TO_FILE);

form.append('image', stream);

// In Node.js environment you need to set boundary in the header field 'Content-Type' by calling method `getHeaders`
const formHeaders = form.getHeaders();

axios.post('http://example.com', form, 
  headers: 
    ...formHeaders,
  ,
)
.then(response => response)
.catch(error => error)

我收到data: 'Content-Length is required'的错误

有什么想法吗?

【问题讨论】:

查看这个答案***.com/a/9641742/8945943 这能回答你的问题吗? How to set Content-Length when sending POST request in NodeJS? 请不要在问题中写答案(作为单独的答案发布)。 【参考方案1】:

可能是我把你的问题弄错了,你想在标题中添加 Content-Length。 我可以看到您正在上传视频流。所以首先你要计算数据块的长度。

('Content-Length', File.getSize(stream)) 参考:Can I stream a file upload to S3 without a content-length header?

您可以将发布请求设为多部分类型:'Content-Type': 'multipart/form-data'。 将大数据发送到服务器的首选方式。 您可以查看此链接:How do I set multipart in axios with react?

如果我的问题有误,请评论或回复。谢谢

【讨论】:

谢谢!您的评论帮助我找到了解决方案!解决方案见下文:Content-Length": fs.statSync(filePath)['size'] 请标记为重复而不是解释现有答案。【参考方案2】:

我的问题的解决方案是相应地设置 Content-Length:

"Content-Length": fs.statSync(filePath)['size']

【讨论】:

以上是关于使用表单数据和 axios 发送文件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 axios 发送数组和表单数据 - Vue

如何通过 Axios 将文件和数据一起发布?

使用axios发送表单数据

如何使用 axios 将文件和 JSON 数据一起发送到 API 端点?

axios发送post请求,如何提交表单数据?

vue表单提交怎么写