首页 > 解决方案 > 用nodejs中的express在sql中上传图像

问题描述

我是节点的新手,我遇到了一些麻烦。我在节点中使用 express,并尝试将图像作为 base64 上传到 sql DB 中的 blob。如果图片小于 50kb,则上传 else got

PayloadTooLargeError:请求实体太大。

我努力了:

错误请求实体太大

请求实体太大如何增加 bodyparser 限制

没有什么对我有用,或者我做错了什么。有人能帮我吗?

编码:

crud.js(将方法转换为 vue2)

    const app = new Vue({
        el: "#main",
        data:{
            id_filme: 2,
            titulo: "",
            imagem: "",
            lancamento: "",
            avaliacao: ""
        },
        mounted(){

        },
        watch:{

        },
        computed:{

        },
        methods:{
            getDados(){

            },
            editar(){
                axios.post('/atualizar/'+ this.id_filme, {
                    id_filme: this.id_filme,
                    titulo: this.titulo,
                    imagem: this.imagem,
                    lancamento: this.lancamento,
                    avaliacao: this.avaliacao

                })
                  .then(function (res) {
                    console.log(res);
                  })
                  .catch(function (error) {
                    // alert("Erro","Ocorreu um erro de servidor, entrar em contato com o analista responsável.","error") 
                    alert("Erro") 
                    console.error('falhou verifique a informação', error); 
                  });
            },
            encodeImageFileAsURL() {
                document.getElementById("capa").innerHTML = "";
                var filesSelected = document.getElementById("imagem").files;
                if (filesSelected.length > 0) {
                    var fileToLoad = filesSelected[0];
                    // console.log(fileToLoad)
                    var fileReader = new FileReader();
                    fileReader.onload = function(fileLoadedEvent) {
                        var srcData = fileLoadedEvent.target.result; // <--- data: base64
                        var newImage = document.createElement('img');
                        newImage.src = srcData;
                        app.imagem = srcData

                        document.getElementById("capa").innerHTML = newImage.outerHTML;
                    }
                    console.log(app.imagem)
                    fileReader.readAsDataURL(fileToLoad);
                }
            }
        }
    })

index.js


    'use strict'

    const   filmes = require('../models/filmes'),
            express = require('express'),
            bodyParser = require('body-parser')
    const erro404 = (req, res, next) => {
        let erro = new Error(),
            locals = {
                titulo: "Erro",
                descricao: "Página não encontrada !",
                contato: "Entre em contato com o administrador do sistema.",
                erro: erro
            }
        erro.status = 404
        res.render('erro.jade', locals)
        next()
    }

    var app = express()

    app
        .use(bodyParser.json({limit: '50mb'}))    
        .use(bodyParser.urlencoded({
            limit: '50mb',
            extended: true,
            parameterLimit:50000
          }))

        .use(filmes)

        .get('/', (req, res, next) => {
            req.getConnection((err, filmes) => {
                filmes.query('SELECT * FROM filmes', (err, rows) =>{
                    if (err){
                        next(new Error('Não há filmes.'))
                    }else{
                        let locals = {
                            principal: 'Lista de Filmes',
                            dados: rows
                        }
                        res.render('index', locals)
                    }
                })
            })
            //next()
        })

        .get('/add', (req,res, next) => {
            res.render('add_filmes.jade', {principal: 'Lista de Filmes', titulo: 'Adicionar Filme'})
        })

        .post('/', (req, res, next) => {
            req.getConnection((err, filmes) => {
                let filme = {
                    id_filme: req.body.id_filme,
                    titulo: req.body.titulo,
                    lancamento: req.body.lancamento,
                    avaliacao: req.body.avaliacao,
                    imagem: req.body.imagem
                }

                console.log(filme)

                filmes.query('INSERT INTO filmes SET ?', filme, (err, rows) =>{
                    return (err) ? next(new Error('Erro ao inserir o filme.')) : res.redirect('/')
                })
            })
        })

        .get('/editar/:id_filme', (req, res, next) => {
            let id_filme = req.params.id_filme

            console.log(id_filme)

            req.getConnection((err, filmes) => {
                filmes.query('SELECT * FROM filmes WHERE id_filme = ?', id_filme, (err, rows) => {
                    console.log(err, "---", rows)
                    if(err){
                        next(new Error('Erro ao pegar os dados do filme.'))
                    }else{
                        let locals = {
                            principal: 'Lista de Filmes', 
                            titulo: 'Editar Filme',
                            dados: rows
                        }

                        res.render('editar_filme.jade', locals)

                    }
                })
            })

        })

        .post('/atualizar/:id_filme', (req, res, next)=>{
            console.log(JSON.stringify(req.body))
            req.getConnection((err, filmes) => {
                let filme = {
                    id_filme: req.body.id_filme,
                    titulo: req.body.titulo,
                    lancamento: req.body.lancamento,
                    avaliacao: req.body.avaliacao,
                    imagem: req.body.imagem
                }

                console.log(filme)

                filmes.query('UPDATE filmes SET ? WHERE id_filme = ?', [filme, filme.id_filme], (err, rows) =>{
                    return (err) ? next(new Error('Erro ao atualizar o filme.')) : res.redirect('/')
                })
            })
        })

        .post('/excluir/:id_filme', (req, res, next)=>{
            let id_filme = req.params.id_filme

            console.log(id_filme)

            req.getConnection((err, filmes) => {
                filmes.query('DELETE FROM filmes WHERE id_filme = ?', id_filme, (err, rows) => {
                    console.log(err, "---", rows)
                    return (err) ? next(new Error('Registro não encontrado !')) : res.redirect('/')
                })
            })
        })

        .use(erro404)


    module.exports = app

```

<b>Thanks in advance.</b>.


标签: node.jsexpressvuejs2

解决方案


要使用 express 上传文件,您应该使用 multer lib。这是因为 express 和 body 解析器处理表单数据。Multer 是上传文件时处理多部分表单数据的正确方法。

var express = require('express')
var multer  = require('multer')
var upload = multer({ dest: 'uploads/' })
app.post('/profile', upload.single('avatar'), function (req, res, next) {
  // após fazer esse request voce deve ver no req.file o arquivo que deseja salvar
  // req.body possuirá os outros atributos que não são multipart formdata
})

uploads您应该在上传文件的文件夹中看到该文件。

如果你想保存在 Postgres 数据库中,你应该使用一个列Bytea来保存你的数据。在进行选择时,您应该select encode(data, 'base64') from filmes where id = $id

您的表单应具有以下属性 enctype="multipart/form-data" 以便 multer 知道要从您的数据中处理什么。

在您的html标签内,属性名称应与multer上传路由中声明的相同:

<form action="/action_page_binary.asp" method="post" enctype="multipart/form-data">
 <input type="file" id="file" name="avatar" multiple>
</form>

推荐阅读