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 相关文章推荐
json 实例详细说明教程
Oct 31 Javascript
javascript之AJAX框架使用说明
Apr 24 Javascript
学习并汇集javascript匿名函数
Nov 25 Javascript
jQuery当鼠标悬停时放大图片的效果实例
Jul 03 Javascript
javascript实现playfair和hill密码算法
Dec 07 Javascript
JavaScript如何实现对数字保留两位小数一位自动补零
Dec 18 Javascript
jQuery CSS3自定义美化Checkbox实现代码
May 12 Javascript
js实现弹窗居中的简单实例
Oct 09 Javascript
javascript 定时器工作原理分析
Dec 03 Javascript
JS实现的走迷宫小游戏完整实例
Jul 19 Javascript
浅谈webpack+react多页面开发终极架构
Nov 11 Javascript
在Vue中使用Select选择器拼接label的操作
Oct 22 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实现多服务器共享SESSION数据的方法
2007/03/16 PHP
php读取excel文件的简单实例
2013/08/26 PHP
5款Javascript颜色选择器
2009/10/25 Javascript
jQuery插件 selectToSelect使用方法
2013/10/02 Javascript
jquery使用ajax实现微信自动回复插件
2014/04/28 Javascript
IE中getElementsByName()对有些元素无效的解决方案
2014/09/28 Javascript
JS跨域解决方案之使用CORS实现跨域
2016/04/14 Javascript
jQuery插件pagination实现无刷新分页
2016/05/21 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
js模仿微信朋友圈计算时间显示几天/几小时/几分钟/几秒之前
2017/04/27 Javascript
用angular实现多选按钮的全选与反选实例代码
2017/05/23 Javascript
Angularjs 手写日历的实现代码(不用插件)
2017/10/18 Javascript
vue中本地静态图片路径写法
2018/03/06 Javascript
js的继承方法小结(prototype、call、apply)(推荐)
2019/04/17 Javascript
JavaScript生成随机验证码代码实例
2019/09/28 Javascript
VUE.js实现动态设置输入框disabled属性
2019/10/28 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
浅析 Vue 3.0 的组装式 API(一)
2020/08/31 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
[48:52]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第一局
2016/02/25 DOTA
django框架基于模板 生成 excel(xls) 文件操作示例
2019/06/19 Python
python随机生成库faker库api实例详解
2019/11/28 Python
Python使用Chrome插件实现爬虫过程图解
2020/06/09 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
汽车检测与维修个人求职信
2013/09/24 职场文书
实习自我鉴定模板
2013/09/28 职场文书
旅游与酒店管理的自我评价分享
2013/11/03 职场文书
大学生个人简历自我评价
2013/11/16 职场文书
计算机专业职业生涯规划范文
2014/01/19 职场文书
监察建议书格式
2014/05/19 职场文书
教师民族团结演讲稿
2014/08/27 职场文书
优秀党员先进事迹材料
2014/12/18 职场文书
2015年社区文体活动总结
2015/03/25 职场文书
2016入党心得体会范文
2016/01/06 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python
【海涛dota解说】一房久违的影魔魂守二连发
2022/04/01 DOTA