使用表单数据和 axios 发送文件
Send file with form-data and axios
我正在尝试将视频发送到视频网站,我可以使用 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'
有什么想法吗?
可能是我问错了,你想在 header 中添加 Content-Length。
我可以看到你正在上传视频流。所以首先你必须计算数据块的长度。
('Content-Length', File.getSize(流))
参考:Can I stream a file upload to S3 without a content-length header?
您可以将 post 请求设为 multi-part 类型:'Content-Type': 'multipart/form-data'。
这是将大数据发送到服务器的首选方式。
你可以检查这个 link : How do I set multipart in axios with react?
如果我答错了你的问题,请评论或回复。谢谢
我的问题的解决方案是相应地设置 Content-Length:
"Content-Length": fs.statSync(filePath)['size']
我认为处理这个问题的最佳方法是实际使用 FormData 自己的方法:
const headers = { 'content-length': formData.getLengthSync(), ...formData.getHeaders() }
这会更准确,因为它包括您可能添加的任何其他数据。
说明一下,如果您使用的是ReadStream,则必须改用异步函数。
const { promisify } = require('util')
const getLength = promisify(formData.getLength.bind(formData))
const contentLength = await getLength()
const headers = { 'content-length': contentLength, ...formData.getHeaders() }
我正在尝试将视频发送到视频网站,我可以使用 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'
有什么想法吗?
可能是我问错了,你想在 header 中添加 Content-Length。 我可以看到你正在上传视频流。所以首先你必须计算数据块的长度。
('Content-Length', File.getSize(流)) 参考:Can I stream a file upload to S3 without a content-length header?
您可以将 post 请求设为 multi-part 类型:'Content-Type': 'multipart/form-data'。 这是将大数据发送到服务器的首选方式。 你可以检查这个 link : How do I set multipart in axios with react?
如果我答错了你的问题,请评论或回复。谢谢
我的问题的解决方案是相应地设置 Content-Length:
"Content-Length": fs.statSync(filePath)['size']
我认为处理这个问题的最佳方法是实际使用 FormData 自己的方法:
const headers = { 'content-length': formData.getLengthSync(), ...formData.getHeaders() }
这会更准确,因为它包括您可能添加的任何其他数据。
说明一下,如果您使用的是ReadStream,则必须改用异步函数。
const { promisify } = require('util')
const getLength = promisify(formData.getLength.bind(formData))
const contentLength = await getLength()
const headers = { 'content-length': contentLength, ...formData.getHeaders() }