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 相关文章推荐
使用Grunt.js管理你项目的应用说明
Apr 24 Javascript
JavaScript异步回调的Promise模式封装实例
Jun 07 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
Mar 24 jQuery
JS小球抛物线轨迹运动的两种实现方法详解
Dec 20 Javascript
vue axios整合使用全攻略
May 24 Javascript
解决JavaScript layui 下拉框不显示的问题
Aug 14 Javascript
Vue项目pdf(base64)转图片遇到的问题及解决方法
Oct 19 Javascript
了解JavaScript函数中的默认参数
May 30 Javascript
vue+element表格导出为Excel文件
Sep 26 Javascript
jQuery+ajax实现用户登录验证
Sep 13 jQuery
Javascript中的解构赋值语法详解
Apr 02 Javascript
JavaScript实现简单的音乐播放器
Aug 14 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
PHP中MD5函数使用实例代码
2008/06/07 PHP
简化php模板页面中分页代码的解析
2009/02/06 PHP
PHP中file_exists()判断中文文件名无效的解决方法
2014/11/12 PHP
php判断文件上传类型及过滤不安全数据的方法
2014/12/17 PHP
简单的无缝滚动程序-仅几行代码
2007/05/08 Javascript
js中cookie的使用详细分析
2008/05/28 Javascript
javascript 网页跳转的方法
2008/12/24 Javascript
javascript使用isNaN()函数判断变量是否为数字
2013/09/21 Javascript
jquery选择器之层级过滤选择器详解
2014/01/27 Javascript
js实现从右向左缓缓浮出网页浮动层广告的方法
2015/05/09 Javascript
javascript操作ul中li的方法
2015/05/14 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
JavaScript基础语法之js表达式
2016/06/07 Javascript
js获取form表单所有数据的简单方法
2016/08/18 Javascript
JavaScript中的遍历详解(多种遍历)
2017/04/07 Javascript
一个简易的js图片轮播效果
2017/07/22 Javascript
bootstrap table插件的分页与checkbox使用详解
2017/07/23 Javascript
jquery实现用户登陆界面(示例讲解)
2017/09/06 jQuery
深入理解Vuex 模块化(module)
2017/09/26 Javascript
vue中keep-alive的用法及问题描述
2018/05/15 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
自己动手封装一个React Native多级联动
2018/09/19 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
vue配置nprogress实现页面顶部进度条
2019/09/21 Javascript
js根据后缀判断文件文件类型的代码
2020/05/09 Javascript
Python爬虫框架Scrapy基本用法入门教程
2018/07/26 Python
python函数局部变量、全局变量、递归知识点总结
2019/11/15 Python
python模拟实现分发扑克牌
2020/04/22 Python
python实现在内存中读写str和二进制数据代码
2020/04/24 Python
移动端html5判断是否滚动到底部并且下拉加载
2019/11/19 HTML / CSS
社区助残日活动总结
2014/08/29 职场文书
大学生求职信怎么写
2015/03/19 职场文书
2015年项目经理工作总结
2015/04/30 职场文书
小学生家长意见
2015/06/03 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫