图片上传之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 文本操作模块-fs模块(一)
Dec 22 NodeJs
Ajax异步文件上传与NodeJS express服务端处理
Apr 01 NodeJs
nodejs处理图片的中间件node-images详解
May 08 NodeJs
nodejs后台集成ueditor富文本编辑器的实例
Jul 11 NodeJs
详解使用vscode+es6写nodejs服务端调试配置
Sep 21 NodeJs
nodejs 最新版安装npm 的使用详解
Jan 18 NodeJs
关于Mac下安装nodejs、npm和cnpm的教程
Apr 11 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
Mac下通过brew安装指定版本的nodejs教程
May 17 NodeJs
nodejs express配置自签名https服务器的方法
May 22 NodeJs
nodejs开发一个最简单的web服务器实例讲解
Jan 02 NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 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
Adodb的十个实例(清晰版)
2006/12/31 PHP
最令PHP初学者们头痛的十四个问题
2007/01/15 PHP
PHP中uploaded_files函数使用方法详解
2011/03/09 PHP
如何用php生成扭曲及旋转的验证码图片
2013/06/07 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
2015/07/06 PHP
php中switch语句用法详解
2015/08/17 PHP
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
用JQuery实现全选与取消的两种简单方法
2014/02/22 Javascript
jQuery中:first选择器用法实例
2014/12/30 Javascript
JavaScript函数详解
2015/02/27 Javascript
js控制网页前进和后退的方法
2015/06/08 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
浅析jQuery操作select控件的取值和设值
2016/12/07 Javascript
高效的jQuery代码编写技巧总结
2017/02/22 Javascript
微信小程序--onShareAppMessage分享参数用处(页面分享)
2017/04/18 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
微信小程序websocket实现聊天功能
2020/03/30 Javascript
node实现生成带参数的小程序二维码并保存到本地功能示例
2018/12/05 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
跟老齐学Python之正规地说一句话
2014/09/28 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
python读取与处理netcdf数据方式
2020/02/14 Python
tensorflow安装成功import tensorflow 出现问题
2020/04/16 Python
手把手教你用纯css3实现轮播图效果实例
2017/05/04 HTML / CSS
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
Napapijri西班牙在线商店:夹克、外套、运动衫等
2020/11/05 全球购物
解决python 输出到csv 出现多空行的情况
2021/03/24 Python
党员公开承诺书内容
2014/05/20 职场文书
初级党校心得体会
2014/09/11 职场文书
防震减灾主题班会
2015/08/14 职场文书
2016年度优秀辅导员事迹材料
2016/02/26 职场文书
如何撰写促销方案?
2019/07/05 职场文书
什么是执行力?9个故事告诉您:成功绝非偶然!
2019/07/05 职场文书
【海涛DOTA解说】EVE女子战队独家录像加ZSMJ神牛两连发
2022/04/01 DOTA