图片上传之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全栈框架StrongLoop推荐
Nov 09 NodeJs
nodejs教程之异步I/O
Nov 21 NodeJs
nodeJS代码实现计算交社保是否合适
Mar 09 NodeJs
ubuntu下安装nodejs以及升级的办法
May 08 NodeJs
Express+Nodejs 下的登录拦截实现代码
Jul 01 NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 NodeJs
NodeJS搭建HTTP服务器的实现步骤
Oct 12 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
NodeJs 模仿SIP话机注册的方法
Jun 21 NodeJs
nodejs二进制与Buffer的介绍与使用
Jul 11 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 NodeJs
分享node.js实现简单登录注册的具体代码
Apr 26 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的魔术方法__get()和__set()使用介绍
2012/09/19 PHP
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
php实现的简单数据库操作Model类
2016/11/16 PHP
PHP new static 和 new self详解
2017/02/19 PHP
PHP面向对象之事务脚本模式(详解)
2017/06/07 PHP
php变量与字符串的增删改查操作示例
2020/05/07 PHP
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
jquery网页元素拖拽插件效果及实现
2013/08/05 Javascript
图标线性回归斜着移动到指定的位置
2013/08/16 Javascript
jquery获取子节点和父节点的示例代码
2013/09/10 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
JS动态创建DOM元素的方法
2015/06/09 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
2015/09/21 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
javascript实现抽奖程序的简单实例
2016/06/07 Javascript
Angular2中Bootstrap界面库ng-bootstrap详解
2016/10/18 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
浅谈node的事件机制
2017/10/09 Javascript
微信小程序基于slider组件动态修改标签透明度的方法示例
2017/12/04 Javascript
vue.js使用v-model指令实现的数据双向绑定功能示例
2018/05/22 Javascript
详解微信UnionID作用
2019/05/15 Javascript
浅析JavaScript 函数柯里化
2020/09/08 Javascript
[08:02]DOTA2牵红线 zhou神抱得美人归
2014/03/22 DOTA
Python中的并发编程实例
2014/07/07 Python
Python实现excel转sqlite的方法
2017/07/17 Python
对numpy数据写入文件的方法讲解
2018/07/09 Python
Python代码实现http/https代理服务器的脚本
2019/08/12 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
思想专业自荐信范文
2013/12/25 职场文书
争论的故事教学反思
2014/02/06 职场文书
文明村创建实施方案
2014/03/27 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
项目战略合作意向书
2015/05/08 职场文书
教师远程培训心得体会
2016/01/09 职场文书
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python