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 相关文章推荐
Mootools 1.2教程 Fx.Morph、Fx选项和Fx事件
Sep 15 Javascript
javascript检查浏览器是否支持flash的实现代码
Aug 14 Javascript
JavaScript给url网址进行encode编码的方法
Mar 18 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
Aug 01 Javascript
jQuery实现选项卡功能(两种方法)
Mar 08 Javascript
Vue v2.5 调整和更新不完全问题
Oct 24 Javascript
动态加载权限管理模块中的Vue组件
Jan 16 Javascript
基于Vue的延迟加载插件vue-view-lazy
May 21 Javascript
jquery获取select选中值的文本,并赋值给另一个输入框的方法
Aug 21 jQuery
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
Sep 25 Javascript
react-router 路由切换动画的实现示例
Dec 03 Javascript
jQuery 选择器用法基础入门示例
Jan 04 jQuery
详解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
php创建桌面快捷方式实现方法
2015/12/31 PHP
php集成开发环境详解
2019/09/24 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
PHP设计模式(五)适配器模式Adapter实例详解【结构型】
2020/05/02 PHP
js跟随滚动条滚动浮动代码
2009/12/31 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
jquery动态改变onclick属性导致失效的问题解决方法
2013/12/04 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
vue.js页面加载执行created,mounted的先后顺序说明
2020/11/07 Javascript
python记录程序运行时间的三种方法
2017/07/14 Python
Python 2.x如何设置命令执行的超时时间实例
2017/10/19 Python
python简单图片操作:打开\显示\保存图像方法介绍
2017/11/23 Python
对numpy中轴与维度的理解
2018/04/18 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
让Python脚本暂停执行的几种方法(小结)
2019/07/11 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
aws 通过boto3 python脚本打pach的实现方法
2020/05/10 Python
没编程基础可以学python吗
2020/06/17 Python
Web时代变迁及html5与html4的区别
2016/01/06 HTML / CSS
英国知名的护肤彩妆与时尚配饰大型综合零售电商:Unineed
2016/11/21 全球购物
Booking.com英国官网:全球酒店在线预订网站
2018/04/21 全球购物
如何估计一张表的大小(假设该表中有1万条数据)
2016/03/27 面试题
主题酒店策划书
2014/01/28 职场文书
业绩考核岗位职责
2014/02/01 职场文书
人代会标语
2014/06/30 职场文书
行政专员岗位职责说明书
2014/07/30 职场文书
干部作风建设工作总结
2014/10/29 职场文书
2015大学生实训报告
2014/11/05 职场文书
2016年社区“我们的节日·中秋节”活动总结
2016/04/05 职场文书
实习报告范文之电话客服岗位
2019/07/26 职场文书
我的暑假生活作文(五年级)范文
2019/08/07 职场文书
mysql如何能有效防止删库跑路
2021/10/05 MySQL
Nginx配置https的实现
2021/11/27 Servers