Home > database >  When trying to upload file, axios throw "Request failed with status code 404"
When trying to upload file, axios throw "Request failed with status code 404"

Time:11-12

I'm using VueJs3, Multer middleware for file uploading, expressJs. Its pretty new for me, so probably it is just a small mistake and i couldn't find it... After submit in console axios throw this error : "Request failed with status code 404".

And console.log(formData.append("file", this.file)) gives 'undefined'.

Some code from component:

import axios from "axios"
export default {
    name: "FileUpload",
    data() {
        return {
            file: "",
            message: "",
        }
    },
    methods: {
        onSelect() {
            const file = this.$refs.file.files[0]
            this.file = file
        },
        async onSubmit() {
            const formData = new FormData()
            formData.append("file", this.file)
            try {
                await axios.post("/upload", formData)
                this.message = "Upload successfully"
            } catch (err) {
                console.log(err)
                this.message = "Something went wrong :("
            }
        },
    },
}

And back-end:

const express = require("express")
const dotenv = require("dotenv")
const cors = require("cors")
const bodyParser = require("body-parser")
// const db = require("./app/config/db.config")
const multer = require("multer")

dotenv.config()

const app = express()
const port = process.env.PORT || 8080

const upload = multer({
    dest: "./uploads",
})

var corsOptions = {
    origin: "http://localhost:8081",
}


app.use(cors())
app.use(express.json())
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))

app.post("/upload", upload.single("file"), (req, res) => {
    res.json({ file: req.file })
})

app.listen(port, () => console.log(`Server started on port ${port}`))

I been trying to look for solutions in some tutorials, but probably mistake is to small for my rookie eyes at the moment...

CodePudding user response:

Not sure which axios version you are using but you could try switching the versions because some versions handle multipart/form-data differently.

from docs

Starting from v0.27.0, Axios supports automatic object serialization to a FormData object if the request Content-Type header is set to multipart/form-data.

I take this to mean that the header needs to be defined explicitly

const formData = new FormData()
formData.append("file", this.file)
await axios.post("/upload", formData, {
  headers: {
    "Content-Type": "multipart/form-data",
  },
})

you can also try using the postForm method

docs

await axios.postForm("/upload", {file: this.file})
// or with multipart
await axios.postForm("/upload", {'files[]': [this.file]})

I would also recommend that you look at the network panel to see if that header is included, and try sending the request directly with something like postman or insomnia to determine definitively whether the issue is on the front-end or back-end.

  • Related