FileUpload.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import { useState } from 'react'
  2. import { endpoint } from '../config'
  3. const FileFields = props => {
  4. const [state, setState] = useState({ ...FileState })
  5. const updateState = async event => {
  6. const { name, type, value, files } = event.target
  7. await setState({
  8. ...state,
  9. [name]: type === 'file' ? files[0] : value
  10. })
  11. console.log(state)
  12. props.onChange(event, state)
  13. }
  14. return (
  15. < fieldset >
  16. <label htmlFor='file'>File</label>
  17. <input type='file' name='file' id='file' onChange={updateState} />
  18. < label htmlFor='name'>File name</label>
  19. <input type='text' name='name' id='name' placeholder='File name' value={state.name} onChange={updateState} />
  20. <label htmlFor='description'>File description</label>
  21. <textarea name='description' id='description' placeholder='File description' value={state.description} onChange={updateState} />
  22. </fieldset >
  23. )
  24. }
  25. const FileState = {
  26. file: null,
  27. name: '',
  28. description: '',
  29. filename: '',
  30. mimetype: '',
  31. size: '',
  32. path: '',
  33. uploading: false
  34. }
  35. async function uploadFile(file) {
  36. const body = new FormData()
  37. body.append('file', file)
  38. const res = await fetch(`${endpoint}/upload`, { method: 'POST', body })
  39. return res.json()
  40. }
  41. class FileUpload extends React.Component {
  42. state = {
  43. ...FileState
  44. }
  45. upload = async event => {
  46. event.preventDefault()
  47. if (!this.state.file) {
  48. alert('Please select file first.')
  49. return
  50. }
  51. this.setState({ uploading: true })
  52. const data = new FormData()
  53. data.append('file', this.state.file)
  54. data.append('description', this.state.description)
  55. const res = await fetch(`${endpoint}/upload`, {
  56. method: 'POST',
  57. body: data
  58. })
  59. const { error, file } = await res.json()
  60. if (error) {
  61. console.error(error)
  62. alert('Upload error.')
  63. this.setState({ uploading: false })
  64. }
  65. this.setState({ path: `${endpoint}/${file.path}`, uploading: false })
  66. }
  67. selectFile = event => {
  68. const { validity, files } = event.target
  69. this.setState({ file: files[0] })
  70. }
  71. handleChange = event => {
  72. this.setState({ [event.target.name]: event.target.value })
  73. }
  74. render() {
  75. return (
  76. <form>
  77. <fieldset>
  78. <input type='file' name='file' id='file'
  79. onChange={this.selectFile}
  80. />
  81. <textarea name="description" id="description" placeholder="Description"
  82. value={this.state.description}
  83. onChange={this.handleChange}
  84. ></textarea>
  85. <img src={this.state.path} alt={this.state.name} />
  86. <button onClick={this.upload} disabled={this.state.uploading}>Save</button>
  87. </fieldset>
  88. </form>
  89. )
  90. }
  91. }
  92. export default FileUpload
  93. export { FileFields, FileState, uploadFile }