Create a new React App using create-react-app as explained in this Post.
In the index.js file change the code as below:
import React from 'react';
import ReactDOM from 'react-dom';
import App from './App';
ReactDOM.render(<App />, document.getElementById('root'));
For the App.js file, change the code as below:
import React from 'react';
import './App.css';
import Fileupload from './FileUpload'
function App() {
return (
<div className="App">
<Fileupload></Fileupload>
</div>
);
}
export default App;
Now comes the FileUpload component as FileUpload.js:
import React from 'react';
import axios from 'axios';
class Fileupload extends React.Component {
constructor(props) {
super(props);
this.state = {
file: '',
};
}
async submit(e) {
e.preventDefault();
const url = `http://url`;
const formData = new FormData();
formData.append('body', this.state.file);
const config = {
headers: {
'content-type': 'multipart/form-data',
'token': 'xxx'
},
};
const HTTP = axios.create({
withCredentials: true
});
//return post(url, formData, config);
return HTTP.post(url, formData, config);
}
setFile(e) {
this.setState({ file: e.target.files[0] });
}
render() {
return (
<div className="container-fluid">
<form onSubmit={e => this.submit(e)}>
<div className="col-sm-12 btn btn-primary">
File Upload
</div>
<h1>File Upload</h1>
<input type="file" onChange={e => this.setFile(e)} />
<button className="btn btn-primary" type="submit">Upload</button>
</form>
</div>
)
}
}
export default Fileupload
Here I’m using axios to call the API via Post request. Passing the credentials in the call with create.
The token part is optional in the Headers, you can add/remove headers based on your requirement.
From the WebAPI end, I’m using .Net core. You can receive the file in the Action method as below:
[HttpPost]
[Route("upload")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
public IActionResult UploadForm([FromQuery] string username)
{
var request = HttpContext.Request;
if (request.Form.Files.Count > 0)
{
filename = request.Form.Files[0].FileName;
extension = filename.Substring(filename.LastIndexOf(".")).ToLower();
if (!string.IsNullOrEmpty(extension) && extension.Equals(".docx"))
{
using (var memoryStream = new MemoryStream())
{
request.Form.Files[0].CopyTo(memoryStream);
// Upload the file if less than 2 MB
if (memoryStream.Length < 2097152)
{
string check = Service.CheckifValid(username);
if (check.Equals("ok"))
{
//Process the stream and pass the data to the back-end in the Service Layer.
result = Service.UploadStream(memoryStream, filename, extension, username);
}
else
{
return Ok(check);
}
}
else
{
return BadRequest("File size too large");
}
}
}
else
{
return BadRequest("File format not recognised.");
}
}
//Other ToDos...
}