笔记有段时间了,截图都被背叛了我,能意会的就意会一下,以此也记录一下自己的学习之路
本文是vue+element-ui+node.js+业务层分离,自己写的一些接口,若缺乏规范大家谨慎参考,可以留言告知我,会及时修改。
1、后台用的node.js,下载了三个模块,fs/path/formidable,
安装指令:
npm install fs --save-dev ,
npm install path --save-dev,
npm install formidable --save-dev
(安装后可以npm fs -v进行查询版本号,能查询到就继续下一步)
2、因为前台拦截上传,用到了跨域,这里用node.js的cors方法
把代码放到最前面也就是require引用的所有模块后面就可以咯,app.js引入上传路由地址以及使用。如下:(代码网上很多,根据项目要求设置)
具体代码:这里注意一个容易犯的错误,网上很多类似的代码:我这里去掉了Content-Type
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')
next();
});
3、先上传路由route代码:(路由层、 controller层都是单独分开的文件)
const express = require('express');
const uploadRouter = express.Router();//express.Router类,创建模块化安装路径的处理程序。
const uploadController = require('./../controller/uploadController.js');//引用控制文件
//.route()函数,创建可链接的途径处理程序的路由路径。
uploadRouter.route('/uploadImage.do').post(uploadController.uploadImage);
//公开
module.exports = uploadRouter;
4、controller控制层代码:请求url :/uploadImage.do
//引用模块:
const formidable = require('formidable');
const path = require('path');
const fs = require('fs');
//详细处理上传图片的代码:
let user = {
uploadImage:function (req,res) {
let form = new formidable.IncomingForm();
form.encoding = 'utf-8';//编码
form.uploadDir = path.join(__dirname + "/../public/images/packImage");//可以修改为自己保存上传图片的文件地址,这里的关系看如下图片
form.keepExtensions = true;//保留后缀
form.maxFieldsSize = 2 * 1024 * 1024;//上传图片大小2m
//处理图片
form.parse(req, function (err, fields, files) {
console.log(files.file.name);
let filename = files.file.name//文件名字
let nameArray = filename.split('.');//分割
let type = nameArray[nameArray.length - 1];
let name = '';
for (let i = 0; i < nameArray.length - 1; i++) {
name = name + nameArray[i];
}
let date = new Date();
let time = '_' + date.getFullYear() + "_" + date.getMonth() + "_" + date.getDay() + "_" + date.getHours() + "_" + date.getMinutes();
let avatarName = name + time + '.' + type;
let newPath = form.uploadDir + "/" + avatarName;
fs.renameSync(files.file.path, newPath); //重命名
console.log(avatarName);
res.send({data: "/images/packImage/" + avatarName})// "/images/packImage/"写自己的保存上传图片的文件
})
}
}
module.exports = user;
接口代码到此为止,接下来是前台代码
5、前台vue,表单形式提交上传图片
<template>
<!-- 弹出框 -->
<el-dialog title="编辑" @click="close" :visible.sync="editVisible" width="30%">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="包装编号" prop="PackingId">
<el-input type="text" v-model="form.PackingId" style="width: 100%;" :disabled="true"></el-input>
</el-form-item>
<el-form-item label="包装名称" prop="PackingName">
<el-input v-model="form.PackingName"></el-input>
</el-form-item>
<el-form-item label="包装价格" prop="PackingPrice">
<el-input v-model="form.PackingPrice"></el-input>
</el-form-item>
<el-form-item label="图片上传" prop="PackingImage">
<el-upload
class="upload-demo"
action="http://localhost:9987/uploadImage.do"
:on-success="uploadSuccess"
:on-preview="handlePreview"
:on-remove="handleRemove"
:file-list="fileList2"
list-type="picture"><!-- on-success是api里的上传成功的钩子;file-list是显示图片 -->
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
</el-upload>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="editVisible = false,saveAddState=false,saveEditState=false">取 消</el-button>
<el-button type="primary" v-if="saveEditState" @click="saveEdit">确 定</el-button>
<el-button type="primary" v-if="saveAddState" @click="saveAdd">添 加</el-button>
</span>
</el-dialog>
</template>
5.1、data和事件
<script>
export default {
name: 'pack',
data() {
return {
uploadImageUrl:"",//存储上传图片返回的路径
uploadImageName:"",//上传图片的名字
fileList2: [],//存放需要显示的图片的名字和路径
}
},
methods: {
//上传图片
handleRemove(file, fileList) {
console.log(file, fileList);
},
handlePreview(file) {
console.log(file);
},
//上传成功后获取到图片路径,并且把原本的图片名称传到后台去,需要拼接一下
uploadSuccess(res, file, fileList){
var name=file.name;
var uploadImageFalseUrl=res.data.split("/");//获取图片原始路径 /images/packImage/2_2018_7_4_13_22.png this.uploadImageUrl="/"+uploadImageFalseUrl[1]+"/"+uploadImageFalseUrl[2]+"/"+name;//拼接图片原本名字,真实传到后台的路径 res.data.split("/")[1]为images, res.data.split("/")[2]为packImage
},
}
</script>
6、扩展1:最终上传图片路径展示:
6.1、获取图片路径:
uploadSuccess(res, file, fileList){
console.log(res)
}
手册解释:http://element-cn.eleme.io/#/zh-CN/component/upload#upload-shang-chuan
有三个参数,可以打印出来看看
on-success文件上传成功时的钩子function(response, file, fileList)
6.2、获取图片路径:(本来此处打印结果有截图,但是图片背叛了我。。。所以大家自己可以打印试试)
uploadSuccess(res, file, fileList){
console.log(res.data)
}
7、扩展2:上传图片成功怎样获得自己图片的名字:
//bug:图片名字最好拼接一下, 不然上传图片名字一样,这就。。。
uploadSuccess(res, file, fileList){
console.log("file.name:"+file.name)
}