0

I can insert a new film into the database, however i have difficulties uploading 1 image together with the film.I heard of multer but unsure, it would be nice if someone can help me. Code: frontend

    <div class="container">
        <nav class="nav">
            <a class="nav-link" href="/">Home</a>
            <a class="nav-link" href="/users/">All Users</a>
        </nav>

        <h1>Register a new DVD</h1>
        <form id="register-form">
            <div class="form-group">
                
                <img src="http://localhost:8081/img/avatar.jpg" id="profilepic" alt="Profile" style="width:100%">    
            </div>

            <div class="form-group">
                <label for="title">title:</label>
                <input type="text" class="form-control" id="title" required>
            </div>
            <div class="form-group">
                <label for="description">Description:</label>
                <input type="text" class="form-control" id="description" required>
            </div>
            <div class="form-group">
                <label for="release">Release:</label>
                <input type="text" class="form-control" id="release" required>
            </div>
            <div class="form-group">
                <label for="lang">Language_id:</label>
                <input type="text" class="form-control" id="lang" required>
            </div>
            <div class="form-group">
                <label for="rental_duration">Rental Duration:</label>
                <input type="text" class="form-control" id="rental_duration" required>
            </div>
            <div class="form-group">
                <label for="rental_rate">Rental rate:</label>
                <input type="text" class="form-control" id="rental_rate" required>
            </div>
            <div class="form-group">
                <label for="length">Length:</label>
                <input type="text" class="form-control" id="length" required>
            </div>
            <div class="form-group">
                <label for="replacement_cost">Replacement Cost:</label>
                <input type="text" class="form-control" id="replacement_cost" required>
            </div>
            <div class="form-group">
                <label for="rating">Rating:</label>
                <input type="text" class="form-control" id="rating" required>
            </div>
            <div class="form-group">
                <label for="special_features">Special Features:</label>
                <input type="text" class="form-control" id="special_features" required>
            </div>

            <div class="form-group">
                <label for="category_id">Category ID:</label>
                <input type="text" class="form-control" id="category_id" required>
            </div>

            <div class="form-group">
                <label for="actors">Actors:</label>
                <input type="text" class="form-control" id="actors" required>
            </div>

            <div class="form-group">
                <label for="store_id">Store_id:</label>
                <input type="text" class="form-control" id="store_id" required>
            </div>

            <button type="submit" class="btn btn-primary">Register</button>
            <button type="reset" class="btn btn-primary ml-5">Reset</button>
            <button type="button" class="btn btn-primary ml-5" id="Logout">Log Out</button>
            <!-- <input type="reset" value="Reset">   -->
        </form>
    </div>
$("#register-form").submit((event) => {
                // prevent page reload
                event.preventDefault();
                const pic = $("#profilepic").val()
                const title = $("#title").val();
                const description = $("#description").val();
                const release = $("#release").val();
                const lang = $("#lang").val();
                const rental_duration = $("#rental_duration").val();
                const rental_rate = $("#rental_rate").val();
                const length = $("#length").val();
                const replacement_cost = $("#replacement_cost").val();
                const rating = $("#rating").val();
                const feature = $("#special_features").val();
                const category_id = $("#category_id").val();
                const actors = $("#actors").val();
                const store_id = $("#store_id").val();

                const requestBody = {
                    image:pic,
                    title: title,
                    description: description,
                    release_year: release,
                    language_id: lang,
                    rental_duration: rental_duration,
                    rental_rate: rental_rate,
                    length: length,
                    replacement_cost: replacement_cost,
                    rating: rating,
                    special_features: feature,
                    category_id: category_id,
                    actors: actors,
                    store_id: store_id
                };
                let token = localStorage.getItem("token");
                console.log(requestBody);
                var formdata = new FormData()
                formdata.append('photo',$('#profilepic').files[0])
                axios.post(`${baseUrl}/film`, requestBody, { headers: { "Authorization": "Bearer " + token } })
                    .then((response) => {
                        console.log(requestBody)
                        window.location.href = "http://localhost:3001/home";
                    })
                    .catch((error) => {
                        console.log(error);
                        if (error.response.status === 400) {
                            alert("Validation failed");
                        } else {
                            alert("Something unexpected went wrong.");
                        }
                    });
            });

app.js // Add film

app.post('/film', isLoggedInMiddleware,(req, res) => {
    var { title, description, release_year, language_id, rental_duration, rental_rate, length, replacement_cost, rating, special_features, category_id, actors, store_id,image } = req.body
    // all details have to be filled to add a new film  unless missing data
    console.log(title, description, release_year, language_id, rental_duration, rental_rate, length, replacement_cost, rating, special_features, category_id, actors, store_id,image);
    if (title == undefined || description == undefined || release_year == undefined || language_id == undefined || rental_duration == undefined ||
        rental_rate == undefined || length == undefined || replacement_cost == undefined || rating == undefined || special_features == undefined ||
        category_id == undefined || actors == undefined || store_id == undefined) {
        console.log("\"error_msg\":\"missing data\"");
        res.status(400).json({ "error_msg": "missing data" });
        return;
    }

    if (!['G', 'PG', 'PG-13', 'R', 'NC-17'].includes(rating)) {
        return res.status(400).json({ "error_msg": "Rating not found" });
    }

    for (let feature of special_features.split(',')) {
        if (!["Trailers", 'Commentaries', 'Deleted Scenes', 'Behind the Scenes'].includes(feature)) {
            return res.status(400).send({ "error_msg": "Special features not found" })
        }
    }
    actorDB.checkLanguage(language_id, (error, data) => {
        if (data.length == 0) {
            res.status(400).json({ "error_msg": "Language not found" })
            return;
        }
        else {
            actorDB.checkCategory(category_id, (error, data) => {
                if (data.length == 0) {
                    res.status(400).json({ "error_msg": "Category not found" })
                    return;
                }
                else {
                    actorDB.checkActors(actors, (error, data) => {
                        if (data != actors.length) {
                            res.status(400).json({ "error_msg": "Actor not found" })
                            return;
                        }
                        else {
                            actorDB.checkStoreId(store_id, (error, data) => {
                                if (data.length == 0) {
                                    res.status(400).json({ "error_msg": "Store_id not found" })
                                    return;
                                }
                                else {
                                    actorDB.addFilm(title, description, release_year, language_id, rental_duration, rental_rate, length, replacement_cost, rating, special_features, category_id, actors, store_id,image, (error, data) => {
                                        console.log((data));

                                        if (!error) {
                                            console.log(data);
                                            res.status(201).json({ "inventory_id": JSON.stringify(data) });
                                            return
                                        }
                                        else {
                                            res.status(500).json({ "error_msg": "Internal server error" });
                                            return;
                                        }

                                    })
                                }
                            })
                        }
                    })
                }
            })
        }
    })
});

fn:

addFilm: (title, description, release_year, language_id, rental_duration, rental_rate, length, replacement_cost, rating, special_features, category_id, actors, store_id,image, callback) => { //1.(1 ~ 3 are places to change code )
    var conn = db.getConnection(); // GET CONNECTION TO DB
    conn.connect((err) => {
        if (err) {
            console.log(err);
            return callback(err, null);
        } else {
            console.log('Connected Successfully!');
            var SQLstatement = //use backtick to go onto next line
            // first insert into film table
                `insert into film (title,description,release_year,language_id,rental_duration,rental_rate,length,replacement_cost,rating,special_features,image)
            Values(?,?,?,?,?,?,?,?,?,?,?)`; // 2.
            conn.query(SQLstatement, [title, description, release_year, language_id, rental_duration, rental_rate, length, replacement_cost, rating, special_features,image], (error, result_id) => { //3.
                if (error) {
                    console.log(error);
                    return callback(error, null);
                }
                else {
                    // second insert into film_category table
                    var SQLstatement = `insert into film_category (film_id,category_id) Values (?,?)`
                    conn.query(SQLstatement, [result_id.insertId, category_id], (error, result) => {
                        if (error) {
                            console.log(error);
                            return callback(error, null);
                        }
                        else {
                            console.log(result);
                            // neeed check actor
                            console.log(actors);
                            var SQLstatement = ''
                            values = []
                            // add a new actor id with the same film id to the film_actor table
                            for (var k = 0; k < actors.length; k++) {
                                if (k == actors.length - 1) {
                                    SQLstatement += `(?,?)`
                                }
                                else {
                                    SQLstatement += `(?,?),`
                                }

                                //  console.log(actors[k])
                                values.push(actors[k])
                                values.push(result_id.insertId)
                            }
                            var finalSQLstatement = `insert into film_actor (actor_id,film_id) Values ` + SQLstatement
                            conn.query(finalSQLstatement, values, (error, result) => {
                                if (error) {
                                    console.log(error);
                                    return callback(error, null);
                                }
                            })


                            console.log(result_id.insertId);
                            var SQLstatement = //use backtick to go onto next line
                            // last insert into inventory with same film_id and store_id
                                `insert into inventory(film_id,store_id) Values(?,?)`; // 2.
                            conn.query(SQLstatement, [result_id.insertId, store_id], (error, result) => { //3.
                                conn.end();
                                if (error) {
                                    console.log(error);
                                    return callback(error, null);
                                }
                                else {
                                    console.log(result);
                                    return callback(null, result.insertId);
                                }
                            });
                        }
                    })

                    // });
                }
            });
        }
    });

},

insert image here

Apparently the code works fine with uploading into database, but for image it uploaded an empty string '' instead of the actual image itself.

mobly elliot
  • 65
  • 1
  • 4

0 Answers0