如何使用 axios 将图像文件上传到 Django_Rest 框架 我有一个简单的模型:
class Article(models.Model):
title = models.CharField(max_length=120)
text = models.TextField()
img = models.ImageField(upload_to='article_images/', blank=True, null=True)
create_time = models.DateTimeField(default=datetime.utcnow, blank=True,
null=True
React JS中的简单形式:
class ArticleForm extends React.Component {
state= {
img: undefined
}
handleUpolad =(event)=>{
event.preventDefault();
const img=event.target.files[0];
this.setState({
img:img
})
}
handleFormSubmit = (event)=>{
event.preventDefault();
const title=event.target.elements.title.value;
const content=event.target.elements.content.value;
Axios.post('http://127.0.0.1:8000/api/',{
title:title,
text:content,
}).then(res=>console.log(res))
.catch(err=>console.log(err))
}
render() {
return (
<div>
<Form onSubmit={this.handleFormSubmit}>
<Form.Item label="Title" >
<Input placeholder="input placeholder" name='title' />
</Form.Item>
<Form.Item label="Content" >
<Input placeholder="input placeholder" name='content' />
</Form.Item>
<Form.Item label="Dragger" >
<div className="dropbox">
<input type='file' onChange={this.handleUpolad} name='img'>
</input>
</div>
</Form.Item>
<Form.Item >
<Button type="primary" htmlType="submit">Submit</Button>
</Form.Item>
</Form>
</div>
);
}
}
仅发布标题和内容时,效果很好。我如何使用 Axios 发布带有此数据的图像文件???? 请任何帮助。预先谢谢你!
答案 0 :(得分:1)
我认为您可以利用FormData API的优势。
此外,我认为您无需在状态中添加图片。您可以简单地将其保留在类变量中。如果设置状态-将没有不必要的重新渲染。为什么不避免呢?
这是带有一些注释的修改后的代码:
class ArticleForm extends React.Component {
pickedFile = null; // save the picked file in this
handleUpolad = event => {
event.preventDefault();
this.pickedFile = event.target.files[0];
}
handleFormSubmit = event => {
event.preventDefault();
let data = new FormData(); // creates a new FormData object
data.append('title', event.target.elements.title.value);
data.append('text', event.target.elements.content.value);
data.append('img', this.pickedFile); // add your file to form data
Axios.post('http://127.0.0.1:8000/api/', data)
.then(res=>console.log(res))
.catch(err=>console.log(err))
}
render() {
// your usual code
}
}