node之本地服务器图片上传的方法示例


Posted in Javascript onMarch 26, 2019

在自己做一个简单的后台管理系统时,用的是node作本地数据库,然后用了Element-ui的upload组件来实现图片的上传,中间有遇到那么点小坑,这里记录下,比较坑的一点就是,不知道文件的命名不能带空格,然后改了好久

1.index.vue文件

这里的话,就是简单点的使用图形界面框架Element-ui的上传组件,然后,action就是服务器端的地址,我这里使用了代理,将localhost:8080代理到你使用node作为服务器的地址就可以了

<template>
  <div class="avatar">
   <img
    :src="avatar?avatar:defaultImg"
   />
  </div>
  <el-upload
   class="upload-demo"
   drag
   action="http://localhost:8080/api/upload"
   :show-file-list="false"
   :on-success="uploadImgSuccess"
  >
   <i class="el-icon-upload"></i>
   <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
  </el-upload>
</template>
<script>
import defaultImg from '@/assets/img/avatar.png'
export default{
  data() {
    return {
      avatar: ''
    }
  },
  methods: {
    uploadImgSuccess(res) {
      this.avatar = res.result.url;
    }
  }
}
</script>

2.代理文件

我这里使用的是vue-cli3脚手架来搭建的项目,所以,自己在项目的根目录下创建一个vue.config.js来做一些配置

module.exports = {
 devServer: {
  port: 8080,
  headers: {
  },
  inline: true,
  overlay: true,
  stats: 'errors-only',
  proxy: {
   '/api': {
    target: 'http://127.0.0.1:3000',
    changeOrigin: true // 是否跨域
   }
  }
 },
};

3.node服务器端文件

这里很重要的一点就是设置静态资源目录

app.use('/serverImage', express.static(path.join(__dirname, 'serverImage')));

对图片上传进行了方法的封装

const fs = require('fs');
const path = require('path');
/* formidable用于解析表单数据,特别是文件上传 */
const formidable = require('formidable');
/* 用于时间格式化 */
const formatTime = require('silly-datetime');

/* 图片上传 */
module.exports = (req, res) => {
 /* 创建上传表单 */
 let form = new formidable.IncomingForm();
 /* 设置编码格式 */
 form.encoding = 'utf-8';
 /* 设置上传目录(这个目录必须先创建好) */
 form.uploadDir = path.join(__dirname, '../serverImage');
 /* 保留文件后缀名 */
 form.keepExtensions = true;
 /* 设置文件大小 */
 form.maxFieldsSize = 2 * 1024 *1024;

 /* 格式化form数据 */
 form.parse(req, (err, fields, files) => {
  let file = files.file;
  /* 如果出错,则拦截 */
  if(err) {
   return res.send({'status': 500, msg: '服务器内部错误', result: ''});
  }

  if(file.size > form.maxFieldsSize) {
   fs.unlink(file.path);
   return res.send({'status': -1, 'msg': '图片不能超过2M', result: ''});
  }

  /* 存储后缀名 */
  let extName = '';

  switch (file.type) {
   case 'image/png':
    extName = 'png';
    break;
   case 'image/x-png':
    extName = 'png';
    break;
   case 'image/jpg':
    extName = 'jpg';
    break;
   case 'image/jpeg':
    extName = 'jpg';
    break;
  }
  if(extName.length == 0) {
   return res.send({'status': -1, 'msg': '只支持jpg和png格式图片', result: ''});
  }

  /* 拼接新的文件名 */
  let time = formatTime.format(new Date(), 'YYYYMMDDHHmmss');
  let num = Math.floor(Math.random() * 8999 + 10000);
  let imageName = `${time}_${num}.${extName}`;
  let newPath = form.uploadDir + '/' + imageName;

  /* 更改名字和路径 */
  fs.rename(file.path, newPath, (err) => {
   if(err) {
    return res.send({'status': -1, 'msg': '图片上传失败', result: ''});
   } else {
    return res.send({'status': 200, 'msg': '图片上传成功', result: {url: `http://localhost:3000/serverImage/${imageName}`}});
   }
  })
 })
};

方法的调用

const express = require('express');
const router = express.Router();
const uploadImg = require('./uploadImg');

/* 上传图片 */
router.post('/upload', (req, res) => {
 uploadImg(req, res);
});

module.exports = router;

服务器端入口文件

const express = require('express');
const app = express();
const path = require('path');
/* body-parser是一个HTTP请求体解析的中间件
 * 使用这个模块可以解析JSON、Raw、文本、URL-encoded格式的请求体
 * */
const bodyParser = require("body-parser");

const dataBaseOperate = require('./database/operate');

/* 以application/json格式解析数据 */
app.use(bodyParser.json());
/* 以application/x-www-form-urlencoded格式解析数据 */
app.use(bodyParser.urlencoded({ extended: false }));

/* 设置静态资源目录 */
app.use('/serverImage', express.static(path.join(__dirname, 'serverImage')));

app.use('/api', dataBaseOperate);


app.listen(3000, () => {
 console.log('server is listening to http://localhost:3000')
});

4.小结

对于接口文件的返回,这里使用了body-parser这个中间件来对node返回的body进行json格式的解析

很重要的一点就是设置静态资源目录,不然的话就会报错,找不到文件或者文件夹

设置静态资源目录,用于存储服务器端的静态资源文件

app.use('/serverImage', express.static(path.join(__dirname, 'serverImage')));

然后就是对文件的命名不能出现空格

文件的链接可以使用本地服务器端的url地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
通过event对象的fromElement属性解决热区设置主实体的一个bug
Dec 22 Javascript
jquery队列queue与原生模仿其实现方法分享
Mar 25 Javascript
使用jquery操作session方法分享
Jan 22 Javascript
.NET微信公众号开发之创建自定义菜单
Jul 16 Javascript
纯javascript实现的小游戏《Flappy Pig》实例
Jul 27 Javascript
AngularJS实现元素显示和隐藏的几个案例
Dec 09 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
Nov 23 Javascript
javascript判断firebug是否开启的方法
Nov 23 Javascript
Vue无限滑动周选择日期的组件的示例代码
Jul 18 Javascript
JavaScript遍历数组和对象的元素简单操作示例
Jul 09 Javascript
layui 上传图片 返回图片地址的方法
Sep 26 Javascript
JavaScript小技巧带你提升你的代码技能
Sep 15 Javascript
详解vue-element Tree树形控件填坑路
Mar 26 #Javascript
vue-router 起步步骤详解
Mar 26 #Javascript
JS div匀速移动动画与变速移动动画代码实例
Mar 26 #Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
Mar 26 #Javascript
详解用JS添加和删除class类名
Mar 25 #Javascript
详解javascript设计模式三:代理模式
Mar 25 #Javascript
js实现鼠标拖拽缩放div实例代码
Mar 25 #Javascript
You might like
swoole_process实现进程池的方法示例
2018/10/29 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
jQuery判断密码强度实现思路及代码
2013/04/24 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
2016/05/10 Javascript
js控制台输出的方法(详解)
2016/11/26 Javascript
Javascript中关于Array.filter()的妙用详解
2016/12/04 Javascript
vue.js全局API之nextTick全面解析
2017/07/07 Javascript
node.js文件上传重命名以及移动位置的示例代码
2018/01/19 Javascript
详解vue-router传参的两种方式
2018/09/10 Javascript
vue+iview 实现可编辑表格的示例代码
2018/10/31 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
前后端常见的几种鉴权方式(小结)
2019/08/04 Javascript
JS XMLHttpRequest原理与使用方法深入详解
2020/04/30 Javascript
JavaScript oncopy事件用法实例解析
2020/05/13 Javascript
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
Python递归实现汉诺塔算法示例
2018/03/19 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
解决python测试opencv时imread导致的错误问题
2019/01/26 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
Python如何使用turtle库绘制图形
2020/02/26 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
Python Pandas 对列/行进行选择,增加,删除操作
2020/05/17 Python
python re.match()用法相关示例
2021/01/27 Python
T3官网:头发造型工具
2019/12/26 全球购物
PHP中如何创建和修改数组
2012/05/02 面试题
大学生文员专业个人求职信范文
2014/01/05 职场文书
会计专业导师推荐信
2014/03/08 职场文书
《卖木雕的少年》教学反思
2014/04/11 职场文书
纪念九一八事变演讲稿1000字
2014/09/14 职场文书
企业法人代表证明书
2014/09/27 职场文书
环境卫生工作汇报材料
2014/10/28 职场文书
2015年司机年终工作总结
2015/05/14 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
企业财务管理制度范本
2015/08/04 职场文书