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的模块写法入门(实例代码)
Mar 07 NodeJs
Nodejs如何复制文件
Mar 09 NodeJs
NodeJS的Promise的用法解析
May 05 NodeJs
Nodejs从有门道无门菜鸟起飞必看教程
Jul 20 NodeJs
解析NodeJs的调试方法
Dec 11 NodeJs
学习 NodeJS 第八天:Socket 通讯实例
Dec 21 NodeJs
nodejs连接mysql数据库简单封装示例-mysql模块
Apr 10 NodeJs
详解nodeJS之路径PATH模块
May 31 NodeJs
nodeJs爬虫的技术点总结
May 13 NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 NodeJs
Nodejs监控事件循环异常示例详解
Sep 22 NodeJs
浅谈vue websocket nodeJS 进行实时通信踩到的坑
Sep 22 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
xajax写的留言本
2006/11/25 PHP
实用PHP会员权限控制实现原理分析
2011/05/29 PHP
php统计文章排行示例
2014/03/04 PHP
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
原来Jquery.load的方法可以一直load下去
2011/03/28 Javascript
JS 操作符整理[推荐收藏]
2011/11/15 Javascript
DOM节点的替换或修改函数replaceChild()用法实例
2015/01/12 Javascript
Jquery attr()方法 属性赋值和属性获取详解
2016/04/15 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
ES6通过babel转码使用webpack使用import关键字
2016/12/13 Javascript
js禁止表单重复提交
2017/08/29 Javascript
JS路由跳转的简单实现代码
2017/09/21 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
记录一次完整的react hooks实践
2019/03/11 Javascript
gulp构建小程序的方法步骤
2019/05/31 Javascript
深度了解vue.js中hooks的相关知识
2019/06/14 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
小程序瀑布流组件实现翻页与图片懒加载
2020/05/19 Javascript
Vue props中Object和Array设置默认值操作
2020/07/30 Javascript
[01:11:37]完美世界DOTA2联赛PWL S2 SZ vs FTD.C 第一场 11.19
2020/11/19 DOTA
python中numpy包使用教程之数组和相关操作详解
2017/07/30 Python
Python3实现抓取javascript动态生成的html网页功能示例
2017/08/22 Python
python字典嵌套字典的情况下找到某个key的value详解
2019/07/10 Python
Django创建一个后台的基本步骤记录
2020/10/02 Python
python 爬虫如何实现百度翻译
2020/11/16 Python
荷兰在线体育用品商店:Avantisport.nl
2018/07/04 全球购物
意大利火车票和铁路通行证专家:ItaliaRail
2019/01/22 全球购物
导游的职业规划书范文
2013/12/27 职场文书
人力资源主管职责范本
2014/03/05 职场文书
农村党支部书记党群众路线四风问题整改措施
2014/09/26 职场文书
世界遗产导游词
2015/02/13 职场文书
爱国主义主题班会
2015/08/14 职场文书
详解MySQL事务的隔离级别与MVCC
2021/04/22 MySQL
业余无线电通联Q语
2022/02/18 无线电