Express系列之multer上传的使用


Posted in Javascript onOctober 27, 2017

这两天在看《nodejs权威指南》,这本书看了好久了,但是读的一直不细,这次才好好看了一遍。

收获还是蛮多的,主要在于wenpack使用的一些细节问题,有点茅塞顿悟的体验吧,另外在node上也不再一脸懵逼了。不过说实话,以现在的水平向直接使用node做点什么还是挺难的,今天测试了下链接mongodb和mysql数据库,虽然能使用,但还是怪怪的。所以就想先使用现有的框架,再反推学习node。

框架的话就选了这个express.

主要就是测试了几个书里提到的中间件,书写的有些早,很多api都过时了,照着官网一点一点找更新的地方看。

目前觉得对我有用的是:multer和static。

后者可以在本地调试页面,对于手机页面尤其有用。

这次主要说一下multer,我并没有实现所有的功能,只是实现单图片上传这一个功能,其他的再摸索喽。

Express系列之multer上传的使用

这是文件的整个目录,主要就两个,一个是根目录下的main.js,还有一个是public/index.html。

放代码:

//main.js
let express = require('express');

var multer = require('multer')

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
   cb(null, 'public/');
  },
  filename: function (req, file, cb) {
   cb(null, Date.now() + '.png');
  }
 })
 
var upload = multer({ storage: storage })

//var upload = multer({ dest: 'public/' })
 

let app = express()

app.use(express.static('public'))

app.post('/public/index.html',upload.single('myfile'),(req,res,next)=>{
  console.log(req.file)
  res.send(req.file)
})

app.listen(3300,'127.0.0.1')
<!-- index.html -->

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>

<body>
  <input type="file" id="file" accept="image/*">
  <div id="result"></div>
  <img src="" alt="" id="img" width="40" height="40">
  <script>
    let file = document.getElementById('file');
    file.onchange = function (e) {
      let file = e.target.files[0];
      let xhr = new XMLHttpRequest();
      let fd = new FormData();
      fd.append('myfile', file)
      xhr.open('post', '/public/index.html')
      xhr.onload = function () {
        // console.log(xhr)
        if (xhr.status === 200) {
          let data = JSON.parse(xhr.responseText)
          document.getElementById('result').innerHTML = this.response
          document.getElementById('img').src = data.filename
        }
      }
      xhr.send(fd)
    }
  </script>
</body>

</html>

不想引用jquery库,我就原生写的ajax,总的来说应该没什么难的,总之就是点击按钮选择完图片之后,会将图片的信息放在一个键名为myfile的对象中,传给后台。

express把接受到的图片存储在/public/文件下,这里有个小小的坑。可以看到我在main.js注释了这样一行代码:

var upload = multer({ dest: 'public/' })

其实最开始的时候我用的就是这一行代码,dest的意思是选择一个路径去存储文件,但是这样写有一个小小的问题,存入进来的文件是没有后缀名的。

我在向前台返回数据的时候

res.send(req.file)

这个问题就很严重,比如一个场景是我上传一张图片做头像,但是等我下次进入自己的个人页面,后台给我返回的数据没有办法作为图片的地址使用,这就很麻烦了。所以在网上找了一个原因,就把上面的代码注释换成了这个:

var storage = multer.diskStorage({
  destination: function (req, file, cb) {
   cb(null, 'public/');
  },
  filename: function (req, file, cb) {
   cb(null, Date.now() + '.png');
  }
})

var upload = multer({ storage: storage })

destination是文件存储的地址,filename设置的是文件的名字,那在这里如果写成这种:

filename: function (req, file, cb) {
 cb(null, file.fieldname + '.png');
}

你会发现你传入的每一张图片的名字都是myfile.png,新的覆盖旧的。所以为了能保存传入的所有图片,我就使用Date.now()作为每张图片不同的识别符,这样就不会再出现覆盖的情况。

目前就这样,下次弄出来了多图片上传我再接着更新。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中也使用$美元符号来代替document.getElementById
Jun 19 Javascript
jQuery插件 selectToSelect使用方法
Oct 02 Javascript
jQuery 写的简单打字游戏可以提示正确和错误的次数
Jul 01 Javascript
JavaScript分页功能的实现方法
Apr 25 Javascript
使用requestAnimationFrame实现js动画性能好
Aug 06 Javascript
基于JavaScript实现鼠标悬浮弹出跟随鼠标移动的带箭头的信息层
Jan 18 Javascript
第一次动手实现bootstrap table分页效果
Sep 22 Javascript
原生JavaScript实现精美的淘宝轮播图效果示例【附demo源码下载】
May 27 Javascript
记一次Vue.js混入mixin的使用(分权限管理页面)
Apr 17 Javascript
vue路由守卫及路由守卫无限循环问题详析
Sep 05 Javascript
layui-table表复选框勾选的所有行数据获取的例子
Sep 13 Javascript
three.js 实现露珠滴落动画效果的示例代码
Mar 01 Javascript
微信小程序返回多级页面的实现方法
Oct 27 #Javascript
微信小程序-getUserInfo回调的实例详解
Oct 27 #Javascript
基于JavaScript实现报警器提示音效果
Oct 27 #Javascript
JavaScript数据结构之双向链表定义与使用方法示例
Oct 27 #Javascript
jQuery判断网页是否已经滚动到浏览器底部的实现方法
Oct 27 #jQuery
动态统计当前输入内容的字节、字符数的实例详解
Oct 27 #Javascript
elemetUi 组件--el-upload实现上传Excel文件的实例
Oct 27 #Javascript
You might like
为PHP初学者的8点有效建议
2010/11/20 PHP
php实现微信模板消息推送
2018/03/30 PHP
JS解析XML的实现代码
2009/11/12 Javascript
jquery 年会抽奖程序
2011/12/22 Javascript
jquery入门—编写一个导航条(可伸缩)
2013/01/07 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
浅谈javascript中关于日期和时间的基础知识
2016/07/13 Javascript
深入浅析search 搜索框的写法
2016/08/02 Javascript
浅谈jQuery为哪般去掉了浏览器检测
2016/08/29 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
vue router自动判断左右翻页转场动画效果
2017/10/10 Javascript
微信小程序异步处理详解
2017/11/10 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
从vue源码解析Vue.set()和this.$set()
2018/08/30 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
vue项目中企业微信使用js-sdk时config和agentConfig配置方式详解
2020/12/15 Vue.js
[03:03]DOTA2 2017国际邀请赛开幕战队入场仪式
2017/08/09 DOTA
菜鸟使用python实现正则检测密码合法性
2016/01/05 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
更新修改后的Python模块方法
2019/03/03 Python
Python3中函数参数传递方式实例详解
2019/05/05 Python
Python面向对象之类的封装操作示例
2019/06/08 Python
基于python的itchat库实现微信聊天机器人(推荐)
2019/10/29 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
什么是python的必选参数
2020/06/21 Python
什么情况下你必须要把一个类定义为abstract的
2013/01/06 面试题
车间调度岗位职责
2013/11/30 职场文书
趣味游戏活动方案
2014/02/07 职场文书
技术负责人任命书
2014/06/05 职场文书
机关副主任个人四风问题整改措施
2014/09/26 职场文书
离婚协议书的范本
2015/01/27 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
写给媳妇的检讨书
2015/05/06 职场文书
2015年车间管理工作总结
2015/07/23 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
使用Bandicam录制鼠标指针并附带点击声音,还可以添加点击动画效果
2022/04/11 数码科技