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 相关文章推荐
Whatever:hover 无需javascript让IE支持丰富伪类
Jun 29 Javascript
myEvent.js javascript跨浏览器事件框架
Oct 24 Javascript
javascript:void(0)使用探讨
Aug 27 Javascript
js实现用户注册协议倒计时的方法
Jan 21 Javascript
浅谈js中变量初始化
Feb 03 Javascript
JavaScript位置与大小(1)之正确理解和运用与尺寸大小相关的DOM属性
Dec 26 Javascript
JavaScript通过filereader接口读取文件
May 10 Javascript
对vue 键盘回车事件的实例讲解
Aug 25 Javascript
写一个Vue Popup组件
Feb 25 Javascript
vue el-tree 默认展开第一个节点的实现代码
May 15 Javascript
javaScript实现一个队列的方法
Jul 14 Javascript
JS中多层次排序算法的实现代码
Jan 06 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序列号生成函数和字符串替换函数代码
2012/06/07 PHP
linux下编译安装memcached服务
2014/08/03 PHP
PHP获取文件夹内文件数的方法
2015/03/12 PHP
Javascript 学习书 推荐
2009/06/13 Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
JavaScript XML和string相互转化实现代码
2011/07/04 Javascript
Jquery Ajax解析XML数据(同步及异步调用)简单实例
2014/02/12 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
JS实现一个列表中包含上移下移删除等功能
2014/09/24 Javascript
javascript实现2016新年版日历
2016/01/25 Javascript
json定义及jquery操作json的方法
2016/10/03 Javascript
BootStrap 页签切换失效的解决方法
2017/08/17 Javascript
NodeJS服务器实现gzip压缩的示例代码
2018/10/12 NodeJs
vue router 组件的高级应用实例代码
2019/04/08 Javascript
深入浅析ng-bootstrap 组件集中 tabset 组件的实现分析
2019/07/19 Javascript
vue.js iview打包上线后字体图标不显示解决办法
2020/01/20 Javascript
python Django模板的使用方法(图文)
2013/11/04 Python
python中defaultdict的用法详解
2017/06/07 Python
django中模板的html自动转意方法
2018/05/27 Python
python打造爬虫代理池过程解析
2019/08/15 Python
Python箱型图处理离群点的例子
2019/12/09 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
Tensorflow中的降维函数tf.reduce_*使用总结
2020/04/20 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
澳大利亚宠物商店:Petbarn
2017/11/18 全球购物
什么是方法的重载
2013/06/24 面试题
团日活动总结模板
2014/06/25 职场文书
优秀家长自荐材料
2014/08/26 职场文书
2015年化妆品销售工作总结
2015/05/11 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
六年级数学教学反思
2016/02/16 职场文书
MySQL 四种连接和多表查询详解
2021/07/16 MySQL
Rhit高效可视化Nginx日志查看工具
2021/11/01 Servers
浅谈Redis的事件驱动模型
2022/05/30 Redis