Node.js实现文件上传的示例


Posted in Javascript onJune 28, 2017

文件上传指的是将用户本地的文件上传到服务器中。

上传文件需要处理两个位置:

客户端

  1. 客户端如何上传文件?
  2. 上传文件的表单项需要指定为input,type是file
  3. 要上传文件必须将表单enctype设置为multipart/form-data 这个参数表示表单将会以多部件表单的形式上传enctype=”application/x-www-form-urlencoded”是默认值。这个值的意思指将会对表单项的内容进行url编码,所谓url编码就将请求参数转换为二进制编码。

1、multipart/form-data body-parser 无法解析, multer 模块专门用来帮助我们解析多部件的请求体。

<body>

<h2>文件上传(file upload)</h2>
<form action="/testUpload" method="post" enctype="multipart/form-data" id="form">
  <pre>
    Hi sir <input type="text" name="username"/>


    upupup <input type="file" name="photo"/>


              <input type="submit" value="提交" id ="btn" style="width:100px;background-color: #99ff99" >
  </pre>
</form>
// 利用AJAX 上传文件
<script>

  var btn = document.getElementById("btn");
 btn.onclick = function () {


    //FormData 这个对象可以用来对表单中的数据进行封装
    //使用FormData来对表单中的数据进行包装
    var fd = new FormData(document.getElementById("form"));

    //创建一个xhr对象
    var xhr = new XMLHttpRequest();

    //设置请求的地址
    xhr.open("post" , "/testUpload");

    //发送请求
    xhr.send(fd);

    //接收响应
    xhr.onreadystatechange = function () {
      if(xhr.readyState == 4 && xhr.status == 200){
        alert(xhr.responseText);
      }
    };

    //取消默认行为
    return false;
  };

</script>
</body>

2. 服务器端

const express = require("express");
const app = express();
const bodyParser = require("body-parser");
const multer = require("multer");
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());
app.use(express.static("public"));
const storage = multer.diskStorage({
  //destination 用来设置上传文件的路径 可以接收一个回调函数, 或者一个字符串
  //如果传递一个回调函数的话,则需要确保路径有效
  destination: 'uploads/',

  //filename 属性可以用来指定文件上传以后保存到服务器中的名字
  filename: function (req, file, cb) {
    //cb(null, file.fieldname + '-' + Date.now())
    //获取文件的扩展名
    //Chrysanthemum.jpg
    let fname = file.originalname;
    let extName = "";
    //判断文件是否具有扩展名
    if(fname.lastIndexOf(".") != -1){
      extName = fname.slice(fname.lastIndexOf("."));
    }

    //上传文件时,一般不会直接将用户的文件名直接保存的服务器中
    //一般会随机生成一个文件名
    cb(null, file.fieldname + '-' + Date.now()+extName);
  }
})
const upload = multer(
  {
    storage: storage,
    limits:{
     //限制文件的大小为200kb
     fileSize:1024*200
     }
  });
app.post("/testUpload" , (req , res)=>{
  //获取解析请求体的函数
  let fu = upload.single('photo');
  //手动调用函数来解析请求体
  fu(req , res , (err)=>{
    if(err){
      //证明上传出错了,文件大小超标
      res.send("文件太大了,请上传200kb以下的文件!!");
    }else{
      //读取请求参数
      let username = req.body.username;
      res.send("上传成功~~~");
    }
  });
});
app.listen(3333,()=>{
  console.log("success");
});

文件夹示例

Node.js实现文件上传的示例

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

Javascript 相关文章推荐
图像替换新技术 状态域方法
Jan 28 Javascript
javascript开发技术大全-第1章javascript概述
Jul 03 Javascript
jquery获得option的值和对option进行操作
Dec 13 Javascript
Javascript基础教程之for循环
Jan 18 Javascript
jQuery实现径向动画菜单效果
Jul 17 Javascript
jquery操作ul的一些操作笔记整理(干货)
Aug 31 jQuery
JavaScript数组去重算法实例小结
May 07 Javascript
JavaScript 2018 中即将迎来的新功能
Sep 21 Javascript
vue-cli3全面配置详解
Nov 14 Javascript
解决layer.open后laydate失效的问题
Sep 06 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
Jan 03 Javascript
JavaScript中变量提升和函数提升的详解
Aug 07 Javascript
iscroll-probe实现下拉刷新和下拉加载效果
Jun 28 #Javascript
JavaScript 获取元素在父节点中的下标(推荐)
Jun 28 #Javascript
JS中把函数作为另一函数的参数传递方法(总结)
Jun 28 #Javascript
js+html制作简单日历的方法
Jun 27 #Javascript
ionic环境配置及问题详解
Jun 27 #Javascript
微信小程序 密码输入(源码下载)
Jun 27 #Javascript
Javascript实现base64的加密解密方法示例
Jun 27 #Javascript
You might like
解决laravel 5.1报错:No supported encrypter found的办法
2017/06/07 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
2018/06/16 PHP
ThinkPHP3.2.3框架Memcache缓存使用方法实例总结
2019/04/15 PHP
轻量级 JS ToolTip提示效果
2010/07/20 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战一)
2013/08/21 Javascript
js的for in循环和java里foreach循环的区别分析
2015/01/28 Javascript
js数组依据下标删除元素
2015/04/14 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
jQuery Validate插件实现表单验证
2016/08/19 Javascript
jQuery实现使用sort方法对json数据排序的方法
2018/04/17 jQuery
一个基于react的图片裁剪组件示例
2018/04/18 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
微信小程序开发之tabbar图标和颜色的实现
2018/10/17 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
JS实现简单的文字无缝上下滚动功能示例
2019/06/22 Javascript
Vue form表单动态添加组件实战案例
2019/09/02 Javascript
vue中的v-model原理,与组件自定义v-model详解
2020/08/04 Javascript
python爬虫框架talonspider简单介绍
2017/06/09 Python
Python断言assert的用法代码解析
2018/02/03 Python
Python实现端口检测的方法
2018/07/24 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
用Python识别人脸,人种等各种信息
2019/07/15 Python
Django 开发调试工具 Django-debug-toolbar使用详解
2019/07/23 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
python json.dumps中文乱码问题解决
2020/04/01 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
css3 transform 3d 使用css3创建动态3d立方体(html5实践)
2013/01/06 HTML / CSS
捷克玩具商店:Bambule
2019/02/23 全球购物
土木工程个人自荐信范文
2013/11/30 职场文书
《小猫刮胡子》教学反思
2014/02/21 职场文书
2014年实习班主任工作总结
2014/11/08 职场文书
2014年校务公开工作总结
2014/12/18 职场文书
新闻稿件写作技巧
2015/07/18 职场文书
python 破解加密zip文件的密码
2021/04/22 Python