'Upload Image with Axios Post request

I am trying to make a post request to an api to upload a user image and send it to the api for profile settings.But i always receive "the image field is required" error although I send formData object. Where is my mistake in below codes ? Please help. below are my codes. Get request is working fine but post request is not working

src - api.js
export const updateProfileImage = (formData) => {
    return axios.post('/my/profile/image', formData, {
        headers: { 'Content-Type': 'multipart/form-data' },
    });
};
src - redux - extraActions.js
export const updateProfileImage = createAsyncThunk(
    'profileCreation/updateProfileImage',
    async (formData, { rejectWithValue }) => {
        return handleApiCall(() => getProfileApi.updateProfileImage(formData), rejectWithValue);
    },
);
src - redux - slice.js
import { createSlice } from '@reduxjs/toolkit';
import { updateProfileImage } from './extraActions';
import { REDUX_LOADING_STATUS } from '@constants/status';
import {
    applyFulfilledStatus,
    applyRejectedStatus,
    applyPendingStatus,
    errorMessage,
    successMessage,
} from '@utils/redux';

const initialState = {
    userInfo: {},
    status: REDUX_LOADING_STATUS,
    statusCode: '',
    message: '',
};

export const profileCreationSlice = createSlice({
    name: 'profile',
    initialState,
    reducers: {},
    extraReducers: (builder) => {
        builder.addCase(updateProfileImage.pending, (state) => {
            console.info('profile image is being sent to api...');
            applyPendingStatus(state);
        });

        builder.addCase(updateProfileImage.rejected, (state, action) => {
            applyRejectedStatus(state, action);
            errorMessage(action.payload.message);
        });

        builder.addCase(updateProfileImage.fulfilled, (state, action) => {
            applyFulfilledStatus(state, action);
            successMessage(action.payload.message);
        });
    },
});

export default profileCreationSlice.reducer;
src - containers- ProfileContainer - generalContainer - index.js
import React from 'react';
import { Row, Col, Button } from 'antd';
import styles from './index.module.less';
import { updateProfileImage } from '@redux/slices/profileCreation/extraActions';

export default function GeneralContainer() {
    const [profileImage, setProfileImage] = useState();


    function updateProfileImg(e) {
        e.preventDefault();
        const formData = new FormData();
        formData.append('profileImage', profileImage);
        dispatch(
            updateProfileImage({
                image: formData,
                // image is my api key
            }),
        );
    }
    return (
        <Row className={styles.rowGeneral}>
            <Col span={24} className={styles.subtitleCol}>
                <h4>Profile Settings</h4>
            </Col>
            <Col span={24}>
                <form onSubmit={updateProfileImg}>
                    <div className={styles.profileImage}>
                        <img
                            src={profileImage ? URL.createObjectURL(profileImage) : userInfo?.thumb}
                        />
                        <p>Profile Photo</p>
                    </div>
                    <label htmlFor="img" className={styles.uploadLabel}>
                        Upload a photo:
                    </label>
                    <input
                        type="file"
                        id="img"
                        name="img"
                        hidden
                        onChange={(e) => {
                            setProfileImage(e.target.files[0]);
                        }}
                    />
                    <input type="submit" />
                </form>
            </Col>
        </Row>
    );
}


Solution 1:[1]

those we are using axios version 0.25 or 0.26, solution is

axios.post(url, formData, {
  headers: { 'Content-Type': 'multipart/form-data' },
  transformRequest: formData => formData,
})

from axios version 0.27, it works as usual.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Khim Bahadur Gurung