node.js - 如何将以下 curl 调用转换为 nodejs axios?
问题描述
curl -F 'data=@./resourcesByFileId.png' -F 'props={"title":"resource title"}' http://localhost:27583/resources
async create(fd: FormData) {
const resp = await axios.post<ResourceGetRes>(
ApiUtil.baseUrl('/resources'),
fd,
{
headers: fd.getHeaders(),
},
)
return resp.data
}
const fd = new FormData()
const path = resolve(__dirname, '../resource/resourcesByFileId.png')
console.log('test create: ', path)
fd.append('props', JSON.stringify({ title: '图片标题' }))
fd.append('data', createReadStream(path))
await resourceApi.create(fd)
我用 form-data 和 axios 试了一下,结果爆炸了
原始问题https://discourse.joplinapp.org/t/how-to-use-joplin-api-resources-id-file/11333/3?u=rxliuli
我尝试了 fetch 并立即成功。下面这两个有区别吗?
describe('diff fetch and axios', () => {
function getFormData() {
const fd = new FormData()
const path = resolve(__dirname, '../resource/resourcesByFileId.png')
const title = 'image title'
fd.append('props', JSON.stringify({ title: title }))
fd.append('data', createReadStream(path))
return fd
}
it('test create by fetch', async () => {
const fd = getFormData()
const resp = await fetch(ApiUtil.baseUrl('/resources'), {
method: 'post',
body: fd,
})
const json = await resp.json()
console.log('json: ', json)
})
it.skip('test create by axios', async () => {
const fd = getFormData()
const resp = await axios.post(ApiUtil.baseUrl('/resources'), fd, {
headers: fd.getHeaders(),
})
console.log('resp.data: ', resp.data)
})
})
解决方案
import React from 'react'
import axios, { post } from 'axios';
class SimpleReactFileUpload extends React.Component {
constructor(props) {
super(props);
this.state ={
file:null
}
this.onFormSubmit = this.onFormSubmit.bind(this)
this.onChange = this.onChange.bind(this)
this.fileUpload = this.fileUpload.bind(this)
}
onFormSubmit(e){
e.preventDefault() // Stop form submit
this.fileUpload(this.state.file).then((response)=>{
console.log(response.data);
})
}
onChange(e) {
this.setState({file:e.target.files[0]})
}
fileUpload(file){
const url = 'http://example.com/file-upload';
const formData = new FormData();
formData.append('file',file)
const config = {
headers: {
'content-type': 'multipart/form-data'
}
}
return post(url, formData,config)
}
render() {
return (
<form onSubmit={this.onFormSubmit}>
<h1>File Upload</h1>
<input type="file" onChange={this.onChange} />
<button type="submit">Upload</button>
</form>
)
}
}
export default SimpleReactFileUpload
推荐阅读
- python - 如何使用 python 在特定索引处对字符串进行切片?
- excel - 有没有办法计算一个类别的出现次数并在 Excel 中分配一个值?
- amazon-web-services - 快速查看 MLOps 监控
- javascript - 在列表中找到字典的最短方法是什么?
- react-native - 图像未在物理设备中以 react-native 显示
- python - 如何根据字符串列表启动 Python pandas 数据帧?
- android - Android - 特定视图或位置的上方/底部弹出窗口
- amazon-web-services - 每当我编辑解析器时,AppSync 控制台的更新速度非常慢
- angular - Jest 无法使用 ts-gaussian 导入在 Angular 包格式项目中运行测试?
- python - 使用 Pandas 进行分组时按条件选择值