图片上传之FileAPI与NodeJs


Posted in NodeJs onJanuary 24, 2017

HTML5之fileAPI

HTML5之fileAPI使得我们处理图片上传更加简单。

实例

html代码

<div class="form-group">
  <label for="modal_inputFile" class="col-md-3 control-label label-font">位置图:</label>
  <div class="col-md-9">
   <input type="text" readonly="" class="form-control" placeholder="点击选择文件">
   <input type="file" id="modal_inputFile">
   <img src="" class="img-responsive" id="modal-pre" alt="预览区" style="max-height: 300px">
  </div>
</div>

效果:

图片上传之FileAPI与NodeJs

这里我们可以通过$("#modal_inputFile")[0].files[0]来获取到图片的信息。

图片上传之FileAPI与NodeJs

这里有name,size,type这几个我们常用的属性。

实现预览

选择好图片后,我们都希望会有个预览功能。这个html5也为我们想到了。

他提供了FileReader这个新的对象给我们。

FileReader该接口主要用来把文件读入内存,并且读取文件中的数据。

这样我们就可以通过date url来实现预览了。

var file = document.getElementById(modal_inputFile'').files[0];
 if (!file) {
 return false;
 }
 var reader = new FileReader();
 reader.readAsDataURL(file);
 reader.onload = function(e) {
 var ib_pre = document.getElementById('modal-pre');
 ib_pre.src = this.result;
}

这样就实现了预览。

图片上传之FileAPI与NodeJs

我们再来查看下img的src。

<img src="data:image/png;base64,iVBORXXXXXXXXXXXXX....XXXXXXX" class="img-responsive" id="modal-pre" alt="预览区" style="max-height: 300px">

src是base64编码。

与后台对接

既然前端使用文件API能满足我们的需求,那我们接下来就需要上传到服务端了。当仁不让的就是NodeJs了。

前端请求

下面是前端发起请求的例子:

//图片上传
$('#preUpload').on('click', function(e) {
 var data = new FormData();
 var _files = $("#modal_inputFile")[0].files[0];
 var ect = ($("#modal_inputFile")[0].files[0]).name.split('.')[1];
 if(ect !== 'png'){
  alert('请上传png图片!')
  return;
 }
 data.append("modal_file", _files);
 $.ajax({
  type: 'post',
  dataType: 'json',
  url: window.stnt_hosts + 'thirdAdmanage/upload/modal',
  data: data,
  contentType: false,
  processData: false
 }).done(function(data, status) {
  console.log('上传成功');
 }).fail(function(err) {
  console.log('上传失败');
 })
})

这里通过FormData来处理我们需要上传的数据。

这里的data数据是一个序列过的对象。后台接受就行了。

后端处理

服务端我们使用node-formidable来处理图片的保存等操作。

见代码:

var formidable = require("formidable");
var form = new formidable.IncomingForm();
//临时目录
form.uploadDir = './upload/';
//预览图片上传
router.post('/upload/modal', function(req, res, next) {
 form.parse(req, function(err, fields, files) {
  if (files.modal_file) {
   rename(files.modal_file.path, files.modal_file.name, 'preview')
   res.send({
    stats:'success',
    data:[]
   })
  }
 })
});
function rename(old, _new, code, bId) {
 var path = './upload/' + code + '/';
  fs.exists(path, function(exists) {
   if (!exists) {
    fs.mkdir(path)
    console.log('创建文件夹!')
   }
   fs.renameSync(old, path + _new, function(err) {
    if (err) {
     console.log(err);
     return;
    }
    console.log('上传成功!')
   })
  })
}

这里使用fs.renameSync的原因是,我们里面设置的临时目录form.uploadDir是存在于内存中的数据,并不是真正的图片。

类似这样

图片上传之FileAPI与NodeJs

我们需要通过fs的方法,将文件重新保存到我们需要的地方即可。这时候就是图片了。

最后

这里的form.parse(req, function(err, fields, files)中的fields与files到底是什么对象,一定要自己调试着看。看完你就明白是什么了。

之前我不清楚的时候就是打开浏览器就搜索,结果可想而知很惨,几乎全是错的。

所以不清楚的话一定要去查github。

还有app.use(bodyParser.urlencoded({ extended: true }));的作用是用来解析我们通常的form表单提交的数据,也就是请求头中包含这样的信息: Content-Type: application/x-www-form-urlencoded

app.use(bodyParser.json())是用来解析json的。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

NodeJs 相关文章推荐
利用NodeJS的子进程(child_process)调用系统命令的方法分享
Jun 05 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
Nodejs搭建wss服务器教程
May 24 NodeJs
基于nodejs 的多页面爬虫实例代码
May 31 NodeJs
NodeJS链接MySql数据库的操作方法
Jun 27 NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
Nodejs+express+ejs简单使用实例代码
Sep 18 NodeJs
nodejs实现的简单web服务器功能示例
Mar 15 NodeJs
nodejs实现超简单生成二维码的方法
Mar 17 NodeJs
nodejs 生成和导出 word的实例代码
Jul 31 NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 NodeJs
初探nodeJS
Jan 24 #NodeJs
进阶之初探nodeJS
Jan 24 #NodeJs
用nodejs搭建websocket服务器
Jan 23 #NodeJs
NodeJS遍历文件生产文件列表功能示例
Jan 22 #NodeJs
nodejs实现发出蜂鸣声音(系统报警声)的方法
Jan 18 #NodeJs
nodejs的压缩文件模块archiver用法示例
Jan 18 #NodeJs
nodejs 实现钉钉ISV接入的加密解密方法
Jan 16 #NodeJs
You might like
php中时间轴开发(刚刚、5分钟前、昨天10:23等)
2011/10/03 PHP
phpmyadmin显示utf8_general_ci中文乱码的问题终级篇
2013/04/08 PHP
ThinkPHP验证码使用简明教程
2014/03/05 PHP
php中有关合并某一字段键值相同的数组合并的改进
2015/03/10 PHP
基于jQuery的树控件实现代码(asp.net+json)
2010/07/11 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
jQuery读取和设定KindEditor值的方法
2013/11/22 Javascript
jquery插件推荐浏览器嗅探userAgent
2014/11/09 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
jQuery web 组件 后台日历价格、库存设置的代码
2016/10/14 Javascript
[01:37]DOTA2超级联赛专访ChuaN 传奇般的电竞之路
2013/06/19 DOTA
[42:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS OpTic
2018/03/31 DOTA
Python解析nginx日志文件
2015/05/11 Python
在Python的while循环中使用else以及循环嵌套的用法
2015/10/14 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
python实现彩票系统
2020/06/28 Python
Flask框架工厂函数用法实例分析
2019/05/25 Python
PyCharm更改字体和界面样式的方法步骤
2019/09/27 Python
浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
2019/10/25 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
CSS3制作轮播图的一种方法
2019/11/11 HTML / CSS
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
建筑施工安全责任书
2014/07/24 职场文书
学风建设演讲稿
2014/09/12 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
六查六看自查报告
2014/10/14 职场文书
一年级语文教学随笔
2015/08/14 职场文书
python OpenCV学习笔记
2021/03/31 Python
Python数据分析入门之数据读取与存储
2021/05/13 Python
如何理解及使用Python闭包
2021/06/01 Python
OpenCV-Python实现轮廓的特征值
2021/06/09 Python
【2·13】一图读懂中国无线电发展
2022/02/18 无线电