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 相关文章推荐
发一个自己用JS写的实用看图工具实现代码
Jul 26 Javascript
javascript如何动态加载表格与动态添加表格行
Nov 27 Javascript
JQuery页面的表格数据的增加与分页的实现
Dec 10 Javascript
用Jquery.load载入页面实现局部刷新
Jan 22 Javascript
JavaScript学习小结(一)——JavaScript入门基础
Sep 02 Javascript
js实现定时进度条完成后切换图片
Jan 04 Javascript
ReactJs设置css样式的方法
Jun 08 Javascript
JS简单实现动态添加HTML标记的方法示例
Apr 08 Javascript
详解小程序输入框闪烁及重影BUG解决方案
Aug 31 Javascript
angular中如何绑定iframe中src的方法
Feb 01 Javascript
微信小程序点击顶部导航栏切换样式代码实例
Nov 12 Javascript
JS异步堆栈追踪之为什么await胜过Promise
Apr 28 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
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
php删除指定目录的方法
2015/04/03 PHP
在WordPress中获取数据库字段内容和添加主题设置菜单
2016/01/11 PHP
Laravel中使用FormRequest进行表单验证方法及问题汇总
2016/06/19 PHP
Yii输入正确验证码却验证失败的解决方法
2017/06/06 PHP
PHP中OpenSSL加密问题整理
2017/12/14 PHP
PHP延迟静态绑定使用方法实例解析
2020/09/05 PHP
六款帮助你实现惊艳视差滚动效果的jQuery插件
2012/09/14 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
解决自定义$(id)的方法与jquery选择器$冲突的问题
2014/06/14 Javascript
node.js中的console.info方法使用说明
2014/12/09 Javascript
js 定义对象数组(结合)多维数组方法
2016/07/27 Javascript
Node.js学习入门
2017/01/03 Javascript
在vue.js中抽出公共代码的方法示例
2017/06/08 Javascript
nuxt 页面路由配置,主页轮播组件开发操作
2020/11/05 Javascript
[01:06:39]DOTA2上海特级锦标赛主赛事日 - 1 胜者组第一轮#1Liquid VS Alliance第三局
2016/03/02 DOTA
Python通过命令开启http.server服务器的方法
2017/11/04 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
python抽取指定url页面的title方法
2018/05/11 Python
python3实现逐字输出的方法
2019/01/23 Python
PyCharm+Qt Designer+PyUIC安装配置教程详解
2019/06/13 Python
python的pip有什么用
2020/06/17 Python
Python random模块的使用示例
2020/10/10 Python
Grid 宫格常用布局的实现
2020/01/10 HTML / CSS
英国网上购买肉类网站:Great British Meat
2018/10/17 全球购物
电钳专业个人求职信
2014/01/04 职场文书
建筑设计专业求职自我评价
2014/03/02 职场文书
党员干部承诺书
2014/03/25 职场文书
继承公证书
2014/04/09 职场文书
旅游与环境专业求职信
2014/06/05 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
集团财务总监岗位职责
2015/04/03 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
关于党风廉政建设宣传教育月的活动总结!
2019/08/08 职场文书
Nginx+SpringBoot实现负载均衡的示例
2021/03/31 Servers
Go中的条件语句Switch示例详解
2021/08/23 Golang