【问题标题】:How to save a file upload to MongoDb in a form along with other data using formidable?如何使用强大的表单将文件上传到 MongoDb 以及其他数据一起保存?
【发布时间】:2017-11-16 21:44:31
【问题描述】:

我正在尝试将form data 保存到MongoDb,其中还包括image file upload。我使用 Jquery form serialize 将此数据发送到 server。其余数据保存到数据库,但不保存图像。我想它需要一些特殊的处理。我怎样才能做到这一点?注意:我希望能够将其与所有表单数据一起发送

这是我的 html 部分:

<!-- SIGNUP for USERS and ADMIN -->
    <div id="pageSignup" class="page popup">
        <div class="wrapper">
            <h3>SIGNUP</h3>
            <form class="form" id="frmSignup">
                <input type="text" id="txtEmailorPhoneNumber" name="txtEmailorPhoneNumber" placeholder="Mobile number or Email" required>
                <input type="text" name="txtName" placeholder="Name" required>
                <input type="text" name="txtLastName" placeholder="Lastname" required>
                <input type="password" name="txtPassword" placeholder="Password" required>
                <div class="lblFileUpload">
                    <p>Select your picture:</p>
                    <input type="file" name="fileUserImage" required>
                </div>
                <button type="button" class="btnShowPage btnForm" id="btnSignupForm">Signup</button>
                <div class="lblFormExtention">
                    <p class="pyesAccount">Already have an account?</p>
                    <button type="button" class="btnShowPage" id="btnLogin" data-showThisPage="pageLogin">Login</button>
                </div>
            </form>
            <h3 class="lblErrorMessage" id="lblSignupErrorMessage"></h3>
        </div>
    </div>

这是jquery序列化部分:

$('#btnSignupForm').click(function () {
        console.log('btn signup user clicked')
        var oForm = $("#frmSignup").serialize()
        console.log("oForm", oForm)
        var sUrl = 'save-user/'
        console.log("sUrl ", sUrl);
        $.post(sUrl, oForm, function (uData) {
            console.log('SUCCESS')
        })
    })

这是我的 server.js:

var express = require('express')
var app = express()
var formidable = require('express-formidable');
app.use(formidable());
app.use(express.static(__dirname + '/public'));
var fs = require('fs')
var mongo = require('mongodb').MongoClient
global.db = null
var sDatabasePath = 'mongodb://localhost:27017/webshop'
global.mongoId = require('mongodb').ObjectID

/**************************************************/

var user = require(__dirname + '/user.js')

/**************************************************/

app.get('/shopaholic', (req, res) => { res.sendFile(__dirname + '/shopaholic.html') })

mongo.connect(sDatabasePath, (err, db) => {
    if (err) {
        console.log('ERROR 003 -> Cannot connect to the database')
        return false
    }
    global.db = db
    console.log('OK 002 -> Connected to the database')
    return true
})

/**************************************************/

app.post('/save-user', (req, res) => {
    //var sName = req.fields.userName 
    //console.log("sName ", sName) 
    user.saveUser(req.fields, (err, jResult) => {
        if (err) {
            console.log(jResult)
            res.send('ERROR')
            return
        }
        console.log(jResult)
        res.send('OK')
        return
    })
})

/**************************************************/

app.listen(3000, (err) => {
    if (err) {
        console.log('ERROR 001 -> Cannot listen to port 3000')
        return false
    }
    console.log('OK 000 -> Server listening to port 3000')
})

最后是我的 user.js:

var user = {}

/**************************************************/

user.saveUser = (jUserData, fcallback) => {
    var jUser = { "userName": jUserData.txtEmailorPhoneNumber, "firstName": jUserData.txtName, "lastName": jUserData.txtLastName, "password": jUserData.txtPassword, "image": jUserData.fileUserImage }
    global.db.collection('users').insertOne(jUser, (err, jResult) => {
        if (err) {
            var jError = { "status": "error", "message": "ERROR -> user.js -> 001" }
            console.log(jError)
            return fcallback(true, jError)

        }
        var jOk = { "status": "ok", "message": "user.js -> saved -> 000" }
        console.log(jOk)
        return fcallback(false, jOk)
    })
}


/**************************************************/

module.exports = user

【问题讨论】:

    标签: jquery node.js mongodb


    【解决方案1】:

    我建议您使用 multer 模块来处理您的文件上传,并且只将 图片的路径/url 保存在您的 mongodb 数据库中,如果您遇到任何问题,请告诉我用这种方法。我很乐意提供帮助。

    【讨论】:

    • 仅靠强大就不可能吗?
    • 会的,但我个人从未使用过它(express-formidable)。
    • 如您所见,我已经在使用它,它确实将其余数据保存到 Mongodb,但不保存 img 上传。这是我在数据库中得到的:{ "_id" : ObjectId("5a0d92f3b8011348aa8dae2e"), "userName" : "a@a.dk", "firstName" : "A", "lastName" : "A", "password" : "1", "image" : null }
    • 在您的代码中,您只读取用于非文件字段的 req.fields,因此您需要读取文件的 req.files。我希望这是问题所在。
    • 它不起作用。我认为实际上我不能直接将文件发送到 mongoDb,首先我需要将文件上传保存在文件系统的文件夹中,然后将其保存到数据库。这是我在许多教程中看到的,但我也不确定。
    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 2014-02-04
    • 1970-01-01
    • 2016-05-30
    • 2012-11-17
    • 2015-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多