nodejs 图片预览和上传的示例代码


Posted in NodeJs onSeptember 30, 2017

本文介绍了nodejs 图片预览和上传的示例代码,分享给大家,具体如下:

效果如下:

nodejs 图片预览和上传的示例代码

前言

一般在上传图片之前需要暂存在本地预览一下。

前端图片预览用的是 FileReader的readAsDataURL方法

nodejs 图片上传用的是中间件 Multer

本地图片预览

FileReader对象允许web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用文件或Blob对象来指定要读取的文件或数据。

readAsDataURL方法用于读取指定的Blob或文件的内容。当读取操作完成后,readyState就完成了,并且触发了loadend。在那个时候,result属性将数据作为一个URL表示文件的数据,作为base64编码的字符串。

单个图片预览

html 部分

<input type="file" onchange="previewFile()"><br>
<img src="" height="200" alt="Image preview...">

javascript 部分

function previewFile() {
 var preview = document.querySelector('img');
 var file  = document.querySelector('input[type=file]').files[0];
 var reader = new FileReader();

 reader.addEventListener("load", function () {
  preview.src = reader.result;
 }, false);

 if (file) {
  reader.readAsDataURL(file);
 }
}

多张图片预览

html 部分

<input id="browse" type="file" onchange="previewFiles()" multiple>
<div id="preview"></div>

javascript 部分

function previewFiles() {

 var preview = document.querySelector('#preview');
 var files  = document.querySelector('input[type=file]').files;

 function readAndPreview(file) {

  // 支持的图片类型(可自定义)
  if ( /\.(jpe?g|png|gif)$/i.test(file.name) ) {
   var reader = new FileReader();

   reader.addEventListener("load", function () {
    var image = new Image();
    image.height = 100;
    image.title = file.name;
    image.src = this.result;
    preview.appendChild( image );
   }, false);

   reader.readAsDataURL(file);
  }

 }
 //files 就是input选中的文件,你也可以对上传图片个数进行限制 (files.length)
 if (files) {
  [].forEach.call(files, readAndPreview);
 }

}

项目中运用

前端部分

html

<input id="txtUploadFile" type="file">
<input id="txtUploadFileList" type="file" accept="image/jpeg,image/png,image/gif" multiple class="upload-file">
<div id="preview"></div>
<input id="btnSend" type="button" value="发送" class="btn btn-default">

javascript

js 方法部分拆开了下,放在一个代码块中有点长 (阅读时请查看上下文)

$(function(){
    var upload={
      txtUploadFile:$('#txtUploadFile'), //上传单个文件
      txtUploadFileList:$('#txtUploadFileList'), //上传多个文件
      btnSend:$('#btnSend'), //上传文件
      preview:$('#preview'),//图片预览盒子
      //预览图片加载
      previewImgLoad:function(fileList){
        for(var i=0;i<fileList.length;i++){
          var tempFile=fileList[i];
          var reader = new FileReader();
          reader.readAsDataURL(tempFile);
          reader.onload=function (e) {
            var image = new Image();
            image.height = 100;
            image.title = tempFile.name;
            image.src = e.target.result;
            upload.preview.append(image);
          }
        }
      }
    }
  });
/*
    上传单个文件
    这里是input改变时后直接上传(用于修改用户头像)
    你也可以在点击上传按钮后再上传,下面的多图上传会给出案例
    */
    upload.txtUploadFile.change(function(){
      var formData = new FormData();
      formData.append('avatar',upload.txtUploadFile[0].files[0]);
      $.ajax({
        url: '/upload/file',
        type: 'post',
        cache: false,
        data: formData,
        processData: false,
        contentType: false,
        success:function(res){
          console.log('upload success');
        },
        error:function(){
          console.log('upload faild');
        }
      });
    });
//加载预览图片
    upload.txtUploadFileList.change(function(){
      var fileList=this.files;
      upload.previewImgLoad(fileList);
    });
//上传多张图片
    upload.btnSend.click(function(){
      var files = upload.txtUploadFileList.prop('files');
      if(files.length==0){
        //没有选择文件直接返回
        return;
      }
      var formData=new FormData();
      for(var i=0;i<files.length;i++){
        formData.append('photos',files[i]);
      }
      $.ajax({
        url: '/upload/filesList',
        type: 'post',
        cache: false,
        data: formData,
        processData: false,
        contentType: false,
        success:function(res){
          console.log('upload success');
          //到这里图片已经上传成功了.你可根据返回结果处理其他的业务逻辑
          if(res.status==1){
            // todo something
          }
        },
        error:function(){
          console.log('upload faild');
        }
      });

    });

nodejs 部分

nodejs 用的是Multer中间件,这个中间件主要用于上传文件

安装Multer

npm install --save multer

Multer在nodejs中使用

var express = require('express');
var multer = require('multer');
var app = express();

//磁盘存储引擎(说白了就是指定上传的文件存储到哪,当然你也可以对文件重命名等等)
var storage=multer.diskStorage({
  destination: function (req, file, cb) {
    //我这里是存储在public下的uploads目录
    cb(null, 'public/uploads/')  
  },
  filename: function (req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now()+"_" + file.originalname)
  }
});

单个图片上传

//如果图片上传成功会返回图片的存储路径
app.post('/upload/file', upload.single('avatar'), function(req, res) {
  if (!req.file) {
    console.log("no file received");
    return res.send({
      status: 0,
      filePath:''
    });
  } else {
    console.log('file received');
    res.send({
      status:1,
      filePath: '/uploads/' + path.basename(req.file.path)
    });
  }
});

多张图片上传

// 如果图片上传成功会返回图片的存储路径(数组)
app.post('/upload/filesList', upload.array('photos',9), function(req, res) {
  if (req.files==undefined) {
    console.log("no files received");
    return res.send({
      status: 0,
      filePath:''
    });
  } else {
    var filesPathArr=[];
    for(var i=0;i<req.files.length;i++){
      filesPathArr.push('/uploads/' + path.basename(req.files[i].path));
    }
    res.send({
      status:1,
      filesPath: filesPathArr
    });
  }
});

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
浅谈NodeJS中require路径问题
May 07 NodeJs
Nodejs抓取html页面内容(推荐)
Aug 11 NodeJs
NodeJS处理Express中异步错误
Mar 26 NodeJs
使用 NodeJS+Express 开发服务端的简单介绍
Apr 07 NodeJs
nodejs入门教程四:URL相关模块用法分析
Apr 24 NodeJs
深入学习nodejs中的async模块的使用方法
Jul 12 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
NodeJS 实现多语言的示例代码
Sep 11 NodeJs
nodejs aes 加解密实例
Oct 10 NodeJs
nodejs图片处理工具gm用法小结
Dec 12 NodeJs
使用nodeJS中的fs模块对文件及目录进行读写,删除,追加,等操作详解
Feb 06 NodeJs
详解NodeJS模块化
Jun 15 NodeJs
Nodejs调用WebService的示例代码
Sep 29 #NodeJs
Nodejs+angularjs结合multiparty实现多图片上传的示例代码
Sep 29 #NodeJs
Nodejs实现文件上传的示例代码
Sep 26 #NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 #NodeJs
使用vs code开发Nodejs程序的使用方法
Sep 21 #NodeJs
详解使用vscode+es6写nodejs服务端调试配置
Sep 21 #NodeJs
在Debian(Raspberry Pi)树莓派上安装NodeJS的教程详解
Sep 19 #NodeJs
You might like
Yii调试SQL的常用方法
2014/07/09 PHP
php+mysql删除指定编号员工信息的方法
2015/01/14 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
PHP的APC模块实现上传进度条
2015/10/27 PHP
php采用session实现防止页面重复刷新
2015/12/24 PHP
javascript 特性检测并非浏览器检测
2010/01/15 Javascript
jquery 操作表格实现代码(多种操作打包)
2011/03/20 Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
2012/05/23 Javascript
javascript得到当前页的来路即前一页地址的方法
2014/02/18 Javascript
JS 获取浏览器和屏幕宽高等信息代码
2014/03/31 Javascript
详解基于Bootstrap扁平化的后台框架Ace
2015/11/27 Javascript
基于JavaScript获取鼠标位置的各种方法
2015/12/16 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
JS刷新父窗口的几种方式小结(推荐)
2016/11/09 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
AngularJS框架的ng-app指令与自动加载实现方法分析
2017/01/04 Javascript
js获取隐藏元素的宽高
2017/02/24 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
2018/01/13 Javascript
angular4 JavaScript内存溢出问题
2018/03/06 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
基于JavaScript实现简单抽奖功能代码实例
2020/10/20 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
常见的python正则用法实例讲解
2016/06/21 Python
pyqt5利用pyqtDesigner实现登录界面
2019/03/28 Python
Python列表切片常用操作实例解析
2019/12/16 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
python实现五子棋游戏(pygame版)
2020/01/19 Python
pyecharts绘制中国2020肺炎疫情地图的实例代码
2020/02/12 Python
Pytorch框架实现mnist手写库识别(与tensorflow对比)
2020/07/20 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
2020/08/05 Python
英国蜡烛、蜡烛配件和家居香氛购买网站:Yankee Candle
2018/12/12 全球购物
益模软件Java笔试题
2012/03/27 面试题
好员工观后感
2015/06/17 职场文书