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. 调用 StatefulWidget 组件的参数时(widget.xxx)报 Invalid Constant Value

    一个 Flutter 组件(Widget)在很多情况下都需要接收一些参数.Flutter 插件通常提示使用 const 关键字包裹某 Widget(很多人接受建议且执行),导致通过 widget.xx ...

  2. 获取jdbc中resultSet结果集的大小

    当我们执行完一条Sql语句,获取到一个 ResultSet 对象后,有时我们需要立即知道到底返回了多少个元素,但是 ResultSet 并没有提供一个 size() 方法 or length 的属性, ...

  3. MySQL索引知识点&面试常见问题

    来源:BiggerBoy 作者:北哥 原文链接:https://mp.weixin.qq.com/s/fucHvdRK5wRrDfBOo6IBGw 大家好我是北哥,今天整理了MySQL索引相关的知识点 ...

  4. CCF NOI Online 2021 提高组 T3 岛屿探险(CDQ 分治,Trie 树)

    题面 凇睦是一个喜欢探险的女孩子,这天她到一片海域上来探险了. 在这片海域上一共有 n 座岛屿排成一排,标号为 1, 2, 3, . . . , n.每座岛屿有两个权值,分别为劳累度 ai 和有趣度 ...

  5. HTML引用CSS实现自适应背景图

    链接图片背景代码 body {background: url('链接') no-repeat center 0;} 颜色代码 body{background:#FFF} 链接图片背景代码2 <b ...

  6. 【面试题】如何去掉vue的url地址中的#号?及其原理?

    如何去掉vue的url地址中的#号?及其原理? 点击打开视频讲解更加详细 如何去掉vue的url地址中的#号? import Vue from 'vue'; import VueRouter from ...

  7. AtCoder Beginner Contest 255(E-F)

    Aising Programming Contest 2022(AtCoder Beginner Contest 255) - AtCoder E - Lucky Numbers 题意: 给两个数组a ...

  8. KingbaseES V8R6 ksql 关闭自动提交

    背景 用过oracle或mysql的人都知道,做一个dml语句,如果发现做错了,还可以rollback,但在Kingbase ksql 中,如果执行一个dml,没有先运行begin; 的话,一执行完就 ...

  9. KingbaseES 数据库删除功能组件

      关键字: KingbaseES.卸载.删除功能   一.安装后检查 在安装完成后,可以通过以下几种方式进行安装正确性验证: 1. 查看安装日志,确认没有错误记录; 2. 查看开始菜单: 查看应用程 ...

  10. Linux_ps总结

    ps命令用于监测进程的工作情况.进程是一直处于动态变化中,而ps命令所显示的进程工作状态时瞬间的 使用方式: ps [options] 常用参数 -A 显示所有进程 -a 显示现行终端机下的所有进程, ...