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异步编程
Dec 04 NodeJs
NodeJS制作爬虫全过程(续)
Dec 22 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
Nodejs学习item【入门手上】
May 05 NodeJs
NodeJS 实现手机短信验证模块阿里大于功能
Jun 19 NodeJs
nodejs中art-template模板语法的引入及冲突解决方案
Nov 07 NodeJs
nodejs实现大文件(在线视频)的读取
Oct 16 NodeJs
详解NODEJS的http实现
Jan 04 NodeJs
NodeJS实现不可逆加密与密码密文保存的方法
Mar 16 NodeJs
Nodejs实现多文件夹文件同步
Oct 17 NodeJs
nodejs实现日志读取、日志查找及日志刷新的方法分析
May 20 NodeJs
纯异步nodejs文件夹(目录)复制功能
Sep 03 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
制作美丽的拉花
2021/03/03 冲泡冲煮
phpstrom使用xdebug配置方法
2013/12/17 PHP
php实现图片添加水印功能
2014/02/13 PHP
php中array_column函数简单实现方法
2016/07/11 PHP
javascript setAttribute, getAttribute 在不同浏览器上的不同表现
2010/08/05 Javascript
在JavaScript并非所有的一切都是对象
2013/04/11 Javascript
基于SVG的web页面图形绘制API介绍及编程演示
2013/06/28 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
js实现页面跳转的几种方法小结
2016/05/16 Javascript
JavaScript创建防篡改对象的方法分析
2018/12/30 Javascript
一些手写JavaScript常用的函数汇总
2019/04/16 Javascript
一百行JS代码实现一个校验工具
2019/04/30 Javascript
Vue 中可以定义组件模版的几种方式
2019/08/06 Javascript
jQuery HTML设置内容和属性操作实例分析
2020/05/20 jQuery
[54:27]TNC vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python读写文件操作示例程序
2013/12/02 Python
python获取从命令行输入数字的方法
2015/04/29 Python
python3使用scrapy生成csv文件代码示例
2017/12/28 Python
对pandas中时间窗函数rolling的使用详解
2018/11/28 Python
pycharm运行和调试不显示结果的解决方法
2018/11/30 Python
Python实现的简单线性回归算法实例分析
2018/12/26 Python
python实现kmp算法的实例代码
2019/04/03 Python
python全栈知识点总结
2019/07/01 Python
jupyter notebook清除输出方式
2020/04/10 Python
Iconfont(矢量图标)+iconmoon(图标svg互转)配合javascript实现社交分享系统
2020/04/21 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
pandas参数设置的实用小技巧
2020/08/23 Python
css3media响应式布局实例
2016/07/08 HTML / CSS
元旦联欢会主持词
2014/03/26 职场文书
大学生交通专业求职信
2014/09/01 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
绿色环保倡议书
2015/04/28 职场文书
办公室主任岗位竞聘书
2015/09/15 职场文书
企业愿景口号
2015/12/25 职场文书
Python绘制散乱的点构成的图的方法
2022/04/21 Python