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 中的 &amp;&amp; 和 || 使用小结
Apr 25 Javascript
基于jquery打造的百分比动态色彩条插件
Sep 19 Javascript
JS简单的图片放大缩小的两种方法
Nov 11 Javascript
jfinal与bootstrap的登录跳转实战演习
Sep 22 Javascript
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
Aug 23 Javascript
JavaScript仿微信(电话)联系人列表滑动字母索引实例讲解(推荐)
Aug 16 Javascript
vue引入jq插件的实例讲解
Sep 12 Javascript
为什么我们要做三份 Webpack 配置文件
Sep 18 Javascript
详解webpack-dev-server 设置反向代理解决跨域问题
Apr 18 Javascript
JS中call和apply函数用法实例分析
Jun 20 Javascript
微信小程序开发之自定义tabBar的实现
Sep 06 Javascript
vue父子组件的通信方法(实例详解)
Nov 10 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 strtotime 函数UNIX时间戳
2009/01/14 PHP
PHP中register_globals参数为OFF和ON的区别(register_globals 使用详解)
2012/02/05 PHP
PHP调用Linux命令权限不足问题解决方法
2015/02/07 PHP
PHP ajax 异步执行不等待执行结果的处理方法
2015/05/27 PHP
php简单图像创建入门实例
2015/06/10 PHP
ThinkPHP中where()使用方法详解
2016/04/19 PHP
php打乱数组二维数组多维数组的简单实例
2016/06/17 PHP
YII2自动登录Cookie总是失效的解决方法
2017/06/28 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
Laravel监听数据库访问,打印SQL的例子
2019/10/24 PHP
PHP替换Word中变量并导出PDF图片的实现方法
2020/11/26 PHP
帮助避免错误的Javascript陷阱清单
2009/05/31 Javascript
jquery处理json数据实例分析
2014/06/03 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
聊一聊JS中的prototype
2016/09/29 Javascript
JavaScript常用正则函数用法示例
2017/01/23 Javascript
JavaScript实现替换字符串中最后一个字符的方法
2017/03/07 Javascript
jQuery中ajax获取数据赋值给页面的实例
2017/12/31 jQuery
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
2018/10/19 Javascript
小程序实现多列选择器
2019/02/15 Javascript
教你用Type Hint提高Python程序开发效率
2016/08/08 Python
Python实现Youku视频批量下载功能
2017/03/14 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
在numpy矩阵中令小于0的元素改为0的实例
2019/01/26 Python
Python中如何使用if语句处理列表实例代码
2019/02/24 Python
TensorFlow实现模型断点训练,checkpoint模型载入方式
2020/05/26 Python
Pytorch如何切换 cpu和gpu的使用详解
2021/03/01 Python
护理专业毕业生自我鉴定
2013/10/08 职场文书
高级护理专业大学生求职信
2013/10/24 职场文书
职务说明书范文
2014/05/07 职场文书
新农村建设汇报材料
2014/08/15 职场文书
个人查摆问题整改措施
2014/10/04 职场文书
公司承诺函范文
2015/01/21 职场文书
幼儿园教师工作总结2015
2015/04/02 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
讲解Python实例练习逆序输出字符串
2022/05/06 Python