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 相关文章推荐
Function.prototype.bind用法示例
Sep 16 Javascript
最好用的省市二级联动 原生js实现你值得拥有
Sep 22 Javascript
js获得当前时区夏令时发生和终止的时间代码
Feb 23 Javascript
JavaScript基础知识之方法汇总结
Jan 24 Javascript
js实现页面a向页面b传参的方法
May 29 Javascript
Vue.js中数据绑定的语法教程
Jun 02 Javascript
React应用中使用Bootstrap的方法
Aug 15 Javascript
简单实现jQuery手风琴效果
Aug 18 jQuery
深入理解ES6学习笔记之块级作用域绑定
Aug 19 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
Apr 08 Javascript
原生JS与CSS实现软件卸载对话框功能
Dec 05 Javascript
基于jQuery拖拽事件的封装
Nov 29 jQuery
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
php数据结构与算法(PHP描述) 快速排序 quick sort
2012/06/21 PHP
phpcms中的评论样式修改方法
2016/10/21 PHP
php curl批处理实现可控并发异步操作示例
2018/05/09 PHP
PDO::errorInfo讲解
2019/01/28 PHP
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
JavaScript中函数声明优先于变量声明的实例分析
2012/03/01 Javascript
jQuery的each终止或跳过示例代码
2013/12/12 Javascript
详解JavaScript对象和数组
2015/12/03 Javascript
JavaScript中字符串与Unicode编码互相转换的实现方法
2015/12/18 Javascript
Bootstrap table分页问题汇总
2016/05/30 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
angular4实现tab栏切换的方法示例
2017/10/21 Javascript
vue2.0.js的多级联动选择器实现方法
2018/02/09 Javascript
vue 子组件向父组件传值方法
2018/02/26 Javascript
Angular6中使用Swiper的方法示例
2018/07/09 Javascript
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
2019/11/07 Javascript
js、jquery实现列表模糊搜索功能过程解析
2020/03/27 jQuery
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
Python enumerate遍历数组示例应用
2008/09/06 Python
python实现五子棋游戏
2019/06/18 Python
对Django中的权限和分组管理实例讲解
2019/08/16 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
Python如何通过Flask-Mail发送电子邮件
2020/01/29 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
canvas实现俄罗斯方块的方法示例
2018/12/13 HTML / CSS
开会迟到检讨书
2014/01/08 职场文书
2016年幼儿园教师政治学习心得体会
2016/01/23 职场文书
《狼牙山五壮士》读后感:宁死不屈,视死如归
2019/08/16 职场文书
导游词之阳朔遇龙河
2019/12/16 职场文书
详解JS WebSocket断开原因和心跳机制
2021/05/07 Javascript
postman中form-data、x-www-form-urlencoded、raw、binary的区别介绍
2022/01/18 HTML / CSS
关于Vue中的options选项
2022/03/22 Vue.js