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 相关文章推荐
Javascript面象对象成员、共享成员变量实验
Nov 19 Javascript
jquery mobile实现拨打电话功能的几种方法
Aug 05 Javascript
javascript 获取图片尺寸及放大图片
Sep 04 Javascript
百度地图自定义控件分享
Mar 04 Javascript
jquery表单验证需要做些什么
Nov 17 Javascript
JavaScript实现256色转灰度图
Feb 22 Javascript
canvas实现爱心和彩虹雨效果
Mar 09 Javascript
Vue响应式原理详解
Apr 18 Javascript
jQuery实现拼图小游戏(实例讲解)
Jul 24 jQuery
vue-router的使用方法及含参数的配置方法
Nov 13 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
Sep 09 Javascript
Echarts实现单条折线可拖拽效果
Dec 19 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
Protoss兵种介绍
2020/03/14 星际争霸
mysql5写入和读出乱码解决
2006/11/25 PHP
浅析PHP水印技术
2007/02/14 PHP
PHP内存缓存Memcached类实例
2014/12/08 PHP
PHP实现获取中英文首字母
2015/06/19 PHP
JavaScript 设计模式之组合模式解析
2010/04/09 Javascript
JQuery 绑定select标签的onchange事件,弹出选择的值,并实现跳转、传参
2011/01/06 Javascript
javascript制作loading动画效果 loading效果
2014/01/14 Javascript
判断复选框是否被选中的两种方法
2014/06/04 Javascript
Javascript控制input输入时间格式的方法
2015/01/28 Javascript
vue从使用到源码实现教程详解
2016/09/19 Javascript
微信小程序 picker 组件详解及简单实例
2017/01/10 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
微信小程序 swiper组件构建轮播图的实例
2017/09/20 Javascript
默认浏览器设置及vue自动打开页面的方法
2018/09/21 Javascript
vue3实现v-model原理详解
2019/10/09 Javascript
vue+animation实现翻页动画
2020/06/29 Javascript
详解如何在Javascript中使用Object.freeze()
2020/10/18 Javascript
探索node之事件循环的实现
2020/10/30 Javascript
python简单猜数游戏实例
2015/07/09 Python
深入浅出分析Python装饰器用法
2017/07/28 Python
详解Python核心编程中的浅拷贝与深拷贝
2018/01/07 Python
Python如何调用外部系统命令
2019/08/07 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
制药工程专业个人求职自荐信
2014/01/25 职场文书
在宿舍喝酒的检讨书
2014/09/28 职场文书
大雁塔英文导游词
2015/02/10 职场文书
音乐剧猫观后感
2015/06/04 职场文书
小学中队委竞选稿
2015/11/20 职场文书
2016年清明节红领巾广播稿
2015/12/17 职场文书
护理培训心得体会
2016/01/22 职场文书
详解python网络进程
2021/06/15 Python
Redis 报错 error:NOAUTH Authentication required
2022/05/15 Redis
浅谈Redis变慢的原因及排查方法
2022/06/21 Redis
CSS子盒子水平和垂直居中的五种方法
2022/07/23 HTML / CSS