node.js - 用nodejs中的express在sql中上传图像
问题描述
我是节点的新手,我遇到了一些麻烦。我在节点中使用 express,并尝试将图像作为 base64 上传到 sql DB 中的 blob。如果图片小于 50kb,则上传 else got
PayloadTooLargeError:请求实体太大。
我努力了:
没有什么对我有用,或者我做错了什么。有人能帮我吗?
编码:
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>.
解决方案
要使用 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>
推荐阅读
- sql - Oracle sql 如何在以下情况下工作
- php - 如何在 behat.yml 中使用 selenium2 驱动程序为 firefox 和 chrome 指定自定义用户代理
- asp.net - Kudu编辑的SurfaceController文件不改变应用内容
- c# - 如何在c#中将字母数字值转换为int
- java - 当我们使用超类引用变量创建子类对象时,内存如何分配给超类和子类成员
- php - 如果参数是数组变量,如何在codeigniter模型中调用存储过程?
- c# - C# 加载文件名中带有句号/句点的文件时出错
- css - 宽度在 IE11 中不换行
- scala - 使用 Mockito 在 Scala 对象中模拟一个函数
- qt - 单击QML中另一个SpinBox的按钮时如何使SpinBox失去焦点