node中间层实现文件上传功能


Posted in Javascript onJune 11, 2018

一般情况下,前端的文件上传一般都是通过form表单的(<input type="file" />)来完成文件的上传,如果使用node中间层完成跨域,文件的上传就需要在node中间层处理成可读流,转成formData完成转发。

一、form表单文件上传

这是最常见的文件上传方式,通过form表单实现,简单实用,设置一下method、enctype、action属性就可以了,多文件上传需要设置multiple属性(部分浏览器支持还是有些问题的)。

<form method="post" enctype="multipart/form-data" action="/api/upload">
  <input type="text" name="username">
  <input type="password" name="password">
  <input type="file" name="file">
  <input type="submit">
</form>

二、FormData实现文件上传

FormData对象用以将数据编译成键值对,以便向后台发送数据。其主要用于发送表单数据,但亦可用于发送带键数据(keyed data),而独立于表单使用。对部分浏览器对multiple属性不支持的情况,可以使用formData的提交方式完成。

<!-- 获取上传文件转成formData类型的文件 -->
<input multiple id="file" name="file" type="file" />
<button id="btn">提交</button>

const oFile = document.getElementById('file')
const oBtn = document.getElementById('btn')

oBtn.addEventListener('click', () => {
  files = oFile.files
  const formData = new FormData()
  formData.append('file', files[0])
  formData.append('file1', files[1])

  fetch('/api/upload', {
    method: "POST",
    body: formData
  })
})

使用fetch请求不要设置Content-Type,否则无法请求

fetch请求默认是不带cookie 

三、node中间层完成文件上传跨域

跨域是因为浏览器的同源策略造成,跨域的方法有很多中,这里使用的是node中间层代理完成(服务端之间的请求是不存在跨域问题)。

node无法直接解析上传的文件,需要引入拓展包connect-multiparty完成,这样就可以拿到文件数据。

拿到上传文件,需要在node中转发请求后台server,这里的文件不能直接发给后台,需要将上传的文件使用fs.createReadStream转成可读流,同时引入 form-data 包(node环境是没有formData对象的),这样就可以实现node中间层转发文件类型

node部分代码:

const fs = require('fs')
const path = require('path')
const FormData = require('form-data')
const express = require('express')
const fetch = require('node-fetch')
const router = express.Router()
const multipart = require('connect-multiparty');
var multipartMiddleware = multipart()

router.post('/upload', multipartMiddleware, function (req, res) {
  // console.log(req.body, req.files);

  const { path: filePath, originalFilename } = req.files.file
  const newPath = path.join(path.dirname(filePath), originalFilename)

  fs.rename(filePath, newPath, function (err) {
    if (err) {
      return;
    }
    else {
      const file = fs.createReadStream(newPath)
      const form = new FormData()
      form.append('file', file)

      fetch('http://localhost:8080/upload', {
        method: "POST",
        body: form
      })
    }
  })
  res.json({})
});

module.exports = router;

注意:

  • node无法直接解析上传文件,需要引入npm包connect-multiparty中间件,或者引入npm包multiparty
  • node拿到文件,需要使用fs.createReadStream转成可读流
  • node环境没有formData对象,需要引入npm包form-data
  • fetch请求提交formData数据,不能设置Comtemt-Type

最后给大家附上完整的代码: node中间层实现文件上传

总结

以上所述是小编给大家介绍的node中间层实现文件上传功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
Prototype Object对象 学习
Jul 12 Javascript
JS Range HTML文档/文字内容选中、库及应用介绍
May 12 Javascript
JavaScript极简入门教程(一):基础篇
Oct 25 Javascript
9款2014最热门jQuery实用特效推荐
Dec 07 Javascript
深入理解JavaScript中的对象
Jun 04 Javascript
实例详解JavaScript获取链接参数的方法
Jan 01 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
Mar 03 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
Oct 28 Javascript
说说如何在Vue.js中实现数字输入组件的方法
Jan 08 Javascript
性能优化篇之Webpack构建速度优化的建议
Apr 03 Javascript
深入了解js原型模式
May 30 Javascript
vue-openlayers实现地图坐标弹框效果
Sep 24 Javascript
几个你不知道的技巧助你写出更优雅的vue.js代码
Jun 11 #Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
Jun 10 #Javascript
实例详解Node.js 函数
Jun 10 #Javascript
微信小程序实现倒计时调用相机自动拍照功能
Jun 10 #Javascript
深入浅析Vue中的Prop
Jun 10 #Javascript
vue项目部署上线遇到的问题及解决方法
Jun 10 #Javascript
js技巧之十几行的代码实现vue.watch代码
Jun 09 #Javascript
You might like
php操作SVN版本服务器类代码
2011/11/27 PHP
使用Huagepage和PGO来提升PHP7的执行性能
2015/11/30 PHP
PHP编程计算日期间隔天数的方法
2017/04/26 PHP
TP5(thinkPHP5框架)实现显示错误信息及行号功能的方法
2019/06/03 PHP
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
js控制表单奇偶行样式的简单方法
2013/07/31 Javascript
javascript新建标签,判断键盘输入,以及判断焦点(示例代码)
2013/11/25 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
jQuery实现表格行上下移动和置顶效果
2015/06/05 Javascript
详解JavaScript的Date对象(制作简易钟表)
2020/04/07 Javascript
jquery实现右侧栏菜单选择操作
2016/03/04 Javascript
浅谈JS中逗号运算符的用法
2016/06/12 Javascript
JavaScript 限制文本框不可输入英文单双引号的方法
2016/12/20 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
angular1.x ui-route传参的三种写法小结
2018/08/31 Javascript
实例分析vue循环列表动态数据的处理方法
2018/09/28 Javascript
如何在微信小程序中使用骨架屏的步骤
2020/06/12 Javascript
[02:40]DOTA2殁境神蚀者 英雄基础教程
2013/11/26 DOTA
[04:10]DOTA2英雄梦之声_第11期_圣堂刺客
2014/06/21 DOTA
Python找出文件中使用率最高的汉字实例详解
2015/06/03 Python
python学习之编写查询ip程序
2016/02/27 Python
python 根据pid杀死相应进程的方法
2017/01/16 Python
Python中str is not callable问题详解及解决办法
2017/02/10 Python
python 实现上传图片并预览的3种方法(推荐)
2017/07/14 Python
Django REST framework内置路由用法
2019/07/26 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
Python range与enumerate函数区别解析
2020/02/28 Python
Python递归函数特点及原理解析
2020/03/04 Python
python实现飞船游戏的纵向移动
2020/04/24 Python
python实现测试工具(一)——命令行发送get请求
2020/10/19 Python
浅谈基于HTML5的在线视频播放方案
2016/02/18 HTML / CSS
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
培根随笔读书笔记
2015/07/01 职场文书
人民调解协议书
2016/03/21 职场文书
python 实现mysql自动增删分区的方法
2021/04/01 Python