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实现继承机制之构造函数方法对象冒充的使用详解
May 07 Javascript
使用js在页面中绘制表格核心代码
Sep 16 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
Dec 04 Javascript
jquery form表单序列化为对象的示例代码
Mar 05 Javascript
jQuery插件kinMaxShow扩展效果用法实例
May 04 Javascript
举例简介AngularJS的内部语言环境
Jun 17 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
Oct 24 Javascript
Vue项目webpack打包部署到服务器的实例详解
Jul 17 Javascript
axios post提交formdata的实例
Mar 16 Javascript
移动端图片上传旋转、压缩问题的方法
Oct 16 Javascript
node.js事件轮询机制原理知识点
Dec 22 Javascript
构建一个JavaScript插件系统
Oct 20 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
在“咖啡之国”感受咖啡文化
2021/03/03 咖啡文化
php使用memcoder将视频转成mp4格式的方法
2015/03/12 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
2008/03/22 Javascript
jQuery EasyUI API 中文文档 - Dialog对话框
2011/11/15 Javascript
jquery实现的伪分页效果代码
2015/10/29 Javascript
jquery 追加元素append、prepend、before、after用法与区别分析
2016/12/02 Javascript
JavaScript 事件对内存和性能的影响
2017/01/22 Javascript
详解Node.js中exports和module.exports的区别
2017/04/19 Javascript
微信小程序选择图片和放大预览图片功能
2017/11/02 Javascript
jquery 遍历hash操作示例【基于ajax交互】
2019/10/12 jQuery
微信小程序仿淘宝热搜词在搜索框中轮播功能
2020/01/21 Javascript
Angular短信模板校验代码
2020/09/23 Javascript
使用PDB模式调试Python程序介绍
2015/04/05 Python
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
Python实现新浪博客备份的方法
2016/04/27 Python
Django实现快速分页的方法实例
2017/10/22 Python
redis之django-redis的简单缓存使用
2018/06/07 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
2018/10/21 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
2019/02/16 Python
python制作抖音代码舞
2019/04/07 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
如何用Python来搭建一个简单的推荐系统
2019/08/07 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
介绍一下RMI的基本概念
2016/12/17 面试题
新郎父亲婚宴答谢词
2014/01/11 职场文书
销售员个人求职的自我评价
2014/02/10 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
亲属关系公证书
2014/04/08 职场文书
关工委先进个人事迹材料
2014/05/23 职场文书
个人年度总结报告
2015/03/09 职场文书
酒店客房服务员岗位职责
2015/04/09 职场文书
导游词之太原天龙山
2020/01/02 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
解决xampp安装后Apache无法启动
2022/03/21 Servers
为Centos安装指定版本的Docker
2022/04/01 Servers