如何用fetch发布图片?

时间:2018-01-16 14:53:55

标签: javascript reactjs post fetch-api

我只是学习反应而且我创建了一个图库应用程序,但是我将图片发布到API时遇到了问题。问题是,当我点击按钮ADD时,在console.log中没有任何事情发生,我得到一个error 500

以下是我发布帖子请求的组件:

class AddPhoto extends Component {
constructor(props) {
    super(props);
    this.state = {
        modal: false,
        images: [],
        isLoading: false,
        error: null,
    };

    this.toggle = this.toggle.bind(this);
    this.handleClick = this.handleClick.bind(this);
    this.handleSubmit = this.handleSubmit.bind(this);
}

toggle() {
    this.setState({
        modal: !this.state.modal
    });
}

handleClick(event) {
    event.preventDefault();
    this.setState({
        modal: !this.state.modal
    });
}

handleSubmit(event){
    event.preventDefault();

    this.setState({ isLoading: true });
    let path = this.props.path;

    fetch(`http://.../gallery/${path}`, {
        method: 'POST',
        headers: {'Content-Type':'multipart/form-data'},
        body: new FormData(document.getElementById('addPhoto'))
    })
        .then((response) => response.json())
        .then((data)=>{
            this.setState({images: data.images, isLoading: false});
            this.props.updateImages(data.images);
        })
        .catch(error => this.setState({ error, isLoading: false}));
}

render() {
    return (
        <Card className="add">
            <div className="link" onClick={this.toggle}>
                <CardBody>
                    <CardTitle>Add picture</CardTitle>
                </CardBody>
            </div>
            <Modal isOpen={this.state.modal} toggle={this.toggle} className={this.props.className}>
                <div className="modal-header">
                    ...
                </div>
                <ModalBody>
                    <form className="addPhotoForm" id="addPhoto" onSubmit={this.handleSubmit}>
                        <input type="file" required />
                        <Button color="success" type="Submit">Add</Button>
                    </form>
                </ModalBody>
            </Modal>
        </Card>
    );
}
}

你知道我做错了什么,为什么不工作,为什么我得到错误500?

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

这是我的上传组件的一部分。  看我怎么做 您可以使用上传按钮修改它,如果需要

    addFile(event) {
            var formData = new FormData();
            formData.append("file",event.target.files[0]);
            formData.append('name', 'some value user types');
            formData.append('description', 'some value user types');
            console.log(event.target.files[0]);

            fetch(`http://.../gallery/${path}`, {
        method: 'POST',
        headers: {'Content-Type':'multipart/form-data'},
        body: {event.target.files[0]}
    })
        .then((response) => response.json())
        .then((data)=>{
            this.setState({images: data.images, isLoading: false});
            this.props.updateImages(data.images);
        })
        .catch(error => this.setState({ error, isLoading: false}));
}
        }

            render(){

                return (
                    <div>
                         <form encType="multipart/form-data" action="">
                        <input id="id-for-upload-file" onChange={this.addFile.bind(this)} type="file"/>
                        </form>

                </div>)
            }
        }

答案 1 :(得分:0)

根据此https://muffinman.io/uploading-files-using-fetch-multipart-form-data,它的工作方式不同,对我来说,它也工作。

const fileInput = document.querySelector('#your-file-input') ;
const formData = new FormData();

formData.append('file', fileInput.files[0]);

    const options = {
      method: 'POST',
      body: formData,
      // If you add this, upload won't work
      // headers: {
      //   'Content-Type': 'multipart/form-data',
      // }
    };

    fetch('your-upload-url', options);

您应该删除'Content-Type': 'multipart/form-data',它开始起作用。