图片上传之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(一)--- Node.js简介及安装开发环境
May 20 NodeJs
轻松创建nodejs服务器(8):非阻塞是如何实现的
Dec 18 NodeJs
轻松创建nodejs服务器(10):处理上传图片
Dec 18 NodeJs
nodejs事件的监听与触发的理解分析
Feb 12 NodeJs
浅析nodejs实现Websocket的数据接收与发送
Nov 19 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
nodejs批量下载图片的实现方法
May 19 NodeJs
使用Nodejs连接mongodb数据库的实现代码
Aug 21 NodeJs
Nodejs进阶之服务端字符编解码和乱码处理
Sep 04 NodeJs
Nodejs连接mysql并实现增、删、改、查操作的方法详解
Jan 04 NodeJs
nodejs实现的连接MySQL数据库功能示例
Jan 25 NodeJs
linux 下以二进制的方式安装 nodejs
Feb 12 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
ini_set的用法介绍
2014/01/07 PHP
php注册审核重点解析(数据访问)
2017/05/23 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
javascript天然的迭代器
2010/10/29 Javascript
ajax与302响应代码测试
2013/10/23 Javascript
jquery库文件略庞大用纯js替换jquery的方法
2014/08/12 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
js实现抽奖效果
2017/03/27 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
[01:51]2018年度CS GO最具人气外援-完美盛典
2018/12/16 DOTA
python正向最大匹配分词和逆向最大匹配分词的实例
2018/11/14 Python
Python3使用xml.dom.minidom和xml.etree模块儿解析xml文件封装函数的方法
2019/09/23 Python
TensorFlow索引与切片的实现方法
2019/11/20 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
Python 私有属性和私有方法应用场景分析
2020/06/19 Python
Python jieba库分词模式实例用法
2021/01/13 Python
html5自带表单验证体验优化及提示气泡修改功能
2017/09/12 HTML / CSS
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
意大利咖啡、浓缩咖啡和浓缩咖啡机:illy caffe
2019/03/20 全球购物
Travelstart沙特阿拉伯:廉价航班、豪华酒店和实惠的汽车租赁优惠
2019/04/06 全球购物
德国二手设计师时装和复古时装跳蚤市场:Mädchenflohmarkt
2020/11/09 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
某科技软件测试面试题
2013/05/19 面试题
恒华伟业笔试面试题
2015/02/26 面试题
后勤采购员岗位职责
2013/12/19 职场文书
车间组长岗位职责
2013/12/20 职场文书
网络事业创业计划书范文
2014/01/09 职场文书
竞职演讲稿范文
2014/01/11 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
物理力学求职信
2014/02/18 职场文书
求职意向书范文
2014/04/01 职场文书
2014年人民警察入党思想汇报
2014/10/12 职场文书
售票员岗位职责
2015/02/15 职场文书
Linux7.6二进制安装Mysql8.0.27详细操作步骤
2021/11/27 MySQL