1、方法一(图片与表单分开,请求2次)

1.1 前台代码

// elementUI表单
<el-form ref="form" class="forms" :model="form">
<div class="title">
<el-input
type="text"
placeholder="请在这里输入标题"
v-model="form.formtitle"
maxlength="48"
show-word-limit
>
</el-input>
</div>
<div class="con">
<div class="toolbar clearfix">
<div class="toolbar-tip"></div>
<ul class="toolbar-group">
<el-upload
action="http://localhost:5000/newtravel/upload"
:before-upload="beforeupload"
:on-change="handleChange"
:show-file-list="false"
:data="form"
>
<li>图片</li>
</el-upload>
</ul>
</div>
<div class="inputcon">
<img v-if="form.imageUrl" :src="form.imageUrl" class="avatar" />
<el-input
type="textarea"
:rows="5"
placeholder="请输入内容"
v-model="form.formconent"
>
</el-input>
</div>
<div class="btns">
<div class="user_accept">
<el-checkbox v-model="isaccept"
>我已阅读并同意
<a href="" title="《马蜂窝游记协议》">《马蜂窝游记协议》</a>
</el-checkbox>
</div>
<el-button type="submit" class="btn_submit" @click="onSumbit"
>发表</el-button
>
<span class="cont">或者</span>
<span class="btn_save">保存草稿</span>
<div class="sync">
<span>同步到:</span>
<ul class="clearfix">
<li>
<a href="javascript:void(0);" title="微博"></a>
</li>
<li>
<a href="javascript:void(0);" title="空间"></a>
</li>
<li>
<a href="javascript:void(0);" title="人人"></a>
</li>
<li>
<a href="javascript:void(0);" title="腾讯"></a>
</li>
</ul>
</div>
</div>
</div>
</el-form>
// elementUI表单方法:
data() {
return {
form: {
formtitle: "",
formconent: "",
imageUrl: "",
},
};
},
methods: {
handleChange(file) {
if (file) {
this.form.imageUrl = URL.createObjectURL(file.raw);
}
},
beforeupload(file) {
const isImage = file.type.includes("image");
if (!isImage) {
this.$message.error("上传文件类型必须是图片!");
}
const isLt2M = file.size / 1024 / 1024 < 2;
if (!isLt2M) {
this.$message.error("上传图片大小不能超过 2MB!");
}
return isImage && isLt2M;
},
onSumbit() {
function settime(time = +new Date()) {
var date = new Date(time + 8 * 3600 * 1000);
return date.toJSON().substr(0, 19).replace("T", " ");
}
let formData = {
formtitle: this.form.formtitle,
formconent: this.form.formconent,
createtime: settime()
};
this.$axios.post("/newtravel", formData).then((res) => {
console.log(res);
});
},
},

1.2 node 后台代码

// app.js
const express = require('express');
const path = require("path");
const travelnotes_query = require('./query/travelnotes_query');
const app = express();
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By", ' 3.2.1')
//方便返回json
res.header("Content-Type", "application/json;charset=utf-8");
if (req.method == 'OPTIONS') {
//让options请求快速返回
res.sendStatus(200);
} else {
next();
}
}); app.use(express.urlencoded({ extended: true }));

app.use(express.static(path.join(__dirname, 'static'))); // 定义写游记接口

app.post('/newtravel', (req, res, next) => {

let data = req.body

travelnotes_query.addNewTravelData(data, function (rec) {

res.json(rec).end();

});

}) // 定义写游记上传图片接口

var multer = require('multer')

var fs = require('fs')

const upload = multer({ dest: __dirname + '/static/upload' }) // 定义图片文件存储位置

app.post('/newtravel/upload', upload.single('file'), async (req, res) => {

let file = req.file;

let basePath = __dirname + '/static/upload/'; // 设置初始路径

let oldFileName = file.filename // 获取文件名

let newFileName = Date.now() + '.png' // 将文件名设置成时间戳png格式

let filePath = basePath + oldFileName; // 源文件路径

let newFilePath = basePath + newFileName; // 新文件路径

if (fs.existsSync(basePath)) { // 判断该目录是否存在,若存在执行文件重命名操作

fs.rename(filePath, newFilePath, (err) => {

if (err) throw err

})

}

let imgurl = 'static/upload/' + newFileName // 设置文件相对路径用于存入数据库

let data2 = {

imgurl: imgurl

}

travelnotes_query.addNewTravelImage(data2, function (rec) {

res.json(rec).end();

});

}) const port = process.env.PORT || 5000;

app.listen(port, function () { console.log(监听端口: ${port}) }); // travelnotes_query.js

const query = require("../dbconn.js");

// 写游记添加数据

exports.addNewTravelData = function (data, callback) {

console.log('获取的数据:', data);

var arr = [];

arr.push(data.formtitle);

arr.push(data.formconent);

arr.push(data.createtime);

query('INSERT INTO travelnotes (formtitle,formconent,createtime) VALUES (?,?,?)', arr, function (err, results, fields) {

if (err) throw err;

callback(results);

});

} // 写游记添加图片

exports.addNewTravelImage = function (data, callback) {

console.log('获取的数据:', data);

var arr = [];

arr.push(data.imgurl);

query('INSERT INTO travelnotes (imgurl) VALUES (?)', arr, function (err, results, fields) {

if (err) throw err;

callback(results);

});

}
// dbconn.js

//定义连接池

const mysql = require('mysql2');

const pool = mysql.createPool({

host: '',

user: '
',

password: '',

database: '
',

dateStrings: true,

waitForConnections: true,

connectionLimit: 50,

queueLimit: 0

});

//定义通用的查询接口并将其导出

var query=function(sql,values,callback){

pool.getConnection(function(err,conn){

if(err){

console.log(err);

callback(err,null,null);

}else{

conn.query(sql,values,function(qerr,results,fields){

//释放连接

conn.release();

//事件驱动回调

callback(qerr,results,fields);

});

}

});

};

module.exports=query;

2、方法二(把表单放在图片里,请求1次)

2.1 vue 前台

// vue 的dom内容
<el-form ref="form" class="forms" :model="form">
<div class="title">
<el-input
type="text"
placeholder="请在这里输入标题"
v-model="form.formtitle"
maxlength="48"
show-word-limit
>
</el-input>
</div>
<div class="con">
<div class="toolbar clearfix">
<div class="toolbar-tip"></div>
<ul class="toolbar-group">
<el-upload
ref="upload"
action="http://localhost:5000/newtravel"
:auto-upload="false"
:before-upload="beforeupload"
:on-change="handleChange"
:show-file-list="false"
:data="form"
>
<li>图片</li>
</el-upload>
</ul>
</div>
<div class="inputcon">
<img v-if="form.imageUrl" :src="form.imageUrl" class="avatar" />
<el-input
type="textarea"
:rows="5"
placeholder="请输入内容"
v-model="form.formconent"
>
</el-input>
</div>
<div class="btns">
<div class="user_accept">
<el-checkbox v-model="isaccept"
>我已阅读并同意
<a href="" title="《马蜂窝游记协议》">《马蜂窝游记协议》</a>
</el-checkbox>
</div>
<el-button type="submit" class="btn_submit" @click="onSumbit('form')"
>发表</el-button
>
<span class="cont">或者</span>
<span class="btn_save">保存草稿</span>
<div class="sync">
<span>同步到:</span>
<ul class="clearfix">
<li>
<a href="javascript:void(0);" title="微博"></a>
</li>
<li>
<a href="javascript:void(0);" title="空间"></a>
</li>
<li>
<a href="javascript:void(0);" title="人人"></a>
</li>
<li>
<a href="javascript:void(0);" title="腾讯"></a>
</li>
</ul>
</div>
</div>
</div>
</el-form>
// vue 的data和methods

data() {

return {

form: {

formtitle: "",

formconent: "",

imageUrl: "",

},

uploadFile: [],

};

},

methods: {

handleChange(file) {

if (file) {

this.form.imageUrl = URL.createObjectURL(file.raw);

this.uploadFile.push(file.raw);

}

},

beforeupload(file) {

const isImage = file.type.includes("image");

if (!isImage) {

this.$message.error("上传文件类型必须是图片!");

}

const isLt2M = file.size / 1024 / 1024 < 2;

if (!isLt2M) {

this.$message.error("上传图片大小不能超过 2MB!");

}

return isImage && isLt2M;

},

onSumbit(form) {

let vm = this;

this.$refs[form].validate((valid)=>{

if(valid){

vm.$refs.upload.submit();

}else{

return false

}

})

},

},

2.2 node 后台

//app.js
// 定义写游记接口
var multer = require('multer')
var fs = require('fs')
const upload = multer({ dest: __dirname + '/static/upload' })
app.post('/newtravel', upload.single('file'), async (req, res) => {
let file = req.file;
let basePath = __dirname + '/static/upload/';
let oldFileName = file.filename
let newFileName = Date.now() + '.png'
let filePath = basePath + oldFileName;
let newFilePath = basePath + newFileName;
if (fs.existsSync(basePath)) {
fs.rename(filePath, newFilePath, (err) => {
if (err) throw err
})
}
let imgurl = 'static/upload/' + newFileName
function settime(time = +new Date()) {
var date = new Date(time + 8 * 3600 * 1000);
return date.toJSON().substr(0, 19).replace("T", " ");
}
let formdata = {
imgurl: imgurl,
formtitle: req.body.formtitle,
formconent: req.body.formconent,
formtitle: req.body.formtitle,
createtime: settime()
}
travelnotes_query.addNewTravelNote(formdata, function (rec) {
res.json(rec).end();
});
})
//travelnotes_query.js

exports.addNewTravelNote = function (data, callback) {

var arr = [];

arr.push(data.formtitle);

arr.push(data.imgurl);

arr.push(data.formconent);

arr.push(data.createtime);

query('INSERT INTO travelnotes (formtitle,imgurl,formconent,createtime) VALUES (?,?,?,?)', arr, function (err, results, fields) {

if (err) throw err;

callback(results);

});

}

其他的内容一样

3、效果预览

vue使用elementUI组件提交表单(带图片)到node后台的更多相关文章

  1. java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例

    java模拟表单上传文件,java通过模拟post方式提交表单实现图片上传功能实例HttpClient 测试类,提供get post方法实例 package com.zdz.httpclient; i ...

  2. java模拟post方式提交表单实现图片上传【转】

     转自:http://blog.csdn.net/5iasp/article/details/8669644 模拟表单html如下:   <form action="up_result ...

  3. vue:父子组件间通信,父组件调用子组件方法进行校验子组件的表单

    参考: ElementUI多个子组件表单的校验管理:https://www.jianshu.com/p/541d8b18cf95 Vue 子组件调用父组件方法总结:https://juejin.im/ ...

  4. vue 中跨组件的表单验证

    使用的是element写的,里面提供了表单验证. 子组件是这样的 <template> <div> <el-form :model="value" r ...

  5. Vue基础-自定义事件的表单输入组件、自定义组件的 v-model

    Vue 测试版本:Vue.js v2.5.13 学习 Vue 的自定义事件的表单输入组件,觉得文档讲的不太细致,所以这里再细化一下: 如果不用 v-model,代码应该是这样: <myinput ...

  6. 26.VUE学习之--提交表单不刷新页面,事件修饰符之使用$event与prevent修复符操作表单

    提交表单不刷新页面 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  7. Element-ui中为上传组件添加表单校验

    vue所依赖的Element的UI库在使用其中的upload组件时,可能很大几率会遇到这个题,需要给upload组件添加表单校验 大家这里直接看代码就可以 <el-form-item class ...

  8. vue.js中 ,回车键实现登录或者提交表单!

    vue的功能非常强大,但是我们作为一个后端开发人员,前端的东西不一定都弄的很明白,今天就给大家介绍一个回车提交表单的真实案例,达到回车登录的效果! @ keyup.enter 实现的效果 <in ...

  9. C#的提交表单方式主要有两种WebClient与HttpWebRequest

    根据黄聪:C#模拟网站页面POST数据提交表单(转) using System; using System.Collections.Generic; using System.IO; using Sy ...

随机推荐

  1. Java项目生成电脑桌面快捷脚本

    一.场景说明 经常需要查询以及设置手机验证码,一般验证码都是放在Redis,为了节省短信费,可以直接设置Redis,本篇内容主要介绍如何便捷查询和设置手机验证码,非开发人员也会操作. 二.Java代码 ...

  2. 线性代数 | Jordan 标准型的笔记

    内容概述: 把方阵 A 的特征多项式 \(c(λ)=|λE-A|\) 展开成 \(c(λ)=\sum_ia_i\lambda^i\) 的形式,然后使用神乎其技的证明,得到 \(c(A)=O\),特征多 ...

  3. 免杀手法-tcp套字节传递shellcode学习

    免杀手法-tcp套字节传递shellcode学习

  4. C++ 性能小测 1 二维数组的遍历效率

    C++ 性能小测 1 二维数组的遍历效率 遍历二维数组时,常规思路是使用一个嵌套循环.一方面,由于 CPU 使用了分支预测技术,因此通常将循环次数最多循环的放在最内层.另一方面,由于二维数组是按行存储 ...

  5. Spring(四)-声明式事务

    Spring-04 声明式事务 1.事务的定义 事务就是由一组逻辑上紧密关联的多个工作单元(数据库操作)而合并成一个整体,这些操作要么都执行,要么都不执行. 2.事务的特性:ACID 1)原子性A : ...

  6. mac_VMWare安装总结

    MacOS 安装VmWare 总结 如果之前安装过virtualBox,virtualBox的内核扩展会影响到VmWare的使用 *比如会导致VMWare虽然可以安装,却无法创建虚拟机 这是需要执行以 ...

  7. 前端必读2.0:如何在React 中使用SpreadJS导入和导出 Excel 文件

    最近我们公司接到一个客户的需求,要求为正在开发的项目加个功能.项目的前端使用的是React,客户想添加具备Excel 导入/导出功能的电子表格模块. 经过几个小时的原型构建后,技术团队确认所有客户需求 ...

  8. K8s deployments的故障排查可视化指南已更新(2021 中文版)

    转载自:https://mp.weixin.qq.com/s/07S930e6vsN2iToo0gP0zg 英文版 高清图地址:https://learnk8s.io/a/a-visual-guide ...

  9. 工厂数字化转型离不开 MES 的原因是什么?

    工厂数字化转型是离不开 MES,首先得弄清楚什么是工厂数字化转型.什么是MES,它们的关系是怎样的. 数字化的主要含义是构建"业务数字化.数字资产化.资产服务化.服务业务化"闭环, ...

  10. 标题,ico动态化

    //获取ico元素 var link = document.querySelector("link[rel*='icon']"); link.href = "image/ ...