图片上传之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 Stream 数据流使用手册
Apr 17 NodeJs
详解NodeJs支付宝移动支付签名及验签
Jan 06 NodeJs
使用nodejs下载风景壁纸
Feb 05 NodeJs
NodeJS创建最简单的HTTP服务器
May 15 NodeJs
nodejs制作爬虫实现批量下载图片
May 19 NodeJs
详解nodejs的express如何自动生成项目框架
Jul 12 NodeJs
nodejs中密码加密处理操作详解
Mar 20 NodeJs
Nodejs Express 通过log4js写日志到Logstash(ELK)
Aug 30 NodeJs
nodejs基础之常用工具模块util用法分析
Dec 26 NodeJs
nodeJS进程管理器pm2的使用
Jan 09 NodeJs
详解利用nodejs对本地json文件进行增删改查
Sep 20 NodeJs
nodejs处理tcp连接的核心流程
Feb 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新手上路(九)
2006/10/09 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
Laravel5.1框架路由分组用法实例分析
2020/01/04 PHP
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
当自定义数据属性为json格式字符串时jQuery的data api问题探讨
2013/02/18 Javascript
在JS中如何调用JSP中的变量
2014/01/22 Javascript
javascript 获取浏览器版本
2015/01/21 Javascript
jQuery实现类似老虎机滚动抽奖效果
2015/08/06 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
BootStrap智能表单实战系列(三)分块表单配置详解
2016/06/13 Javascript
Bootstrap表单布局
2016/07/19 Javascript
javascript函数中的3个高级技巧
2016/09/22 Javascript
Bootstrap模态框使用详解
2017/02/15 Javascript
AngularJS表单提交实例详解
2017/02/18 Javascript
浅谈JavaScript正则表达式-非捕获性分组
2017/03/08 Javascript
Angular2学习教程之ng中变更检测问题详解
2017/05/28 Javascript
在小程序中使用canvas的方法示例
2018/09/17 Javascript
详解Vue中使用Axios拦截器
2019/04/22 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
JavaScript实现点击切换功能
2021/01/27 Javascript
python二叉树遍历的实现方法
2013/11/21 Python
Python函数可变参数定义及其参数传递方式实例详解
2015/05/25 Python
python中的迭代和可迭代对象代码示例
2017/12/27 Python
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
python绘制动态曲线教程
2020/02/24 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
浅谈html5 video 移动端填坑记
2018/01/15 HTML / CSS
美国乡村商店:Plow & Hearth
2016/09/12 全球购物
伦敦高达60%折扣的钻石珠宝商:Purely Diamonds
2018/06/24 全球购物
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
自考毕业生自我鉴定
2013/11/04 职场文书
公司财务工作总结的自我评价
2013/11/23 职场文书
安全生产大检查方案
2014/05/07 职场文书
师德师风承诺书
2014/05/23 职场文书
天下第一关导游词
2015/02/06 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python