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 相关文章推荐
css3元素简单的闪烁效果实现(html5 jquery)
Dec 28 Javascript
百度地图自定义控件分享
Mar 04 Javascript
JavaScript的代码编写格式规范指南
Dec 07 Javascript
JQuery fileupload插件实现文件上传功能
Mar 18 Javascript
JS组件Bootstrap实现下拉菜单效果代码
Apr 26 Javascript
bootstrap导航、选项卡实现代码
Dec 28 Javascript
浅谈原生JS实现jQuery的animate()动画示例
Mar 08 Javascript
React Native模块之Permissions权限申请的实例相机
Sep 28 Javascript
解决jquery validate 验证不通过后验证正确的信息仍残留在label上的方法
Aug 27 jQuery
在博客园博文中添加自定义右键菜单的方法详解
Feb 05 Javascript
js实现html滑动图片拼图验证
Jun 24 Javascript
vue判断按钮是否可以点击
Apr 09 Vue.js
几个你不知道的技巧助你写出更优雅的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
星际争霸兵种名称对照表
2020/03/04 星际争霸
有关于PHP中常见数据类型的汇总分享
2014/01/06 PHP
yii权限控制的方法(三种方法)
2015/12/28 PHP
yii去掉必填项中星号的方法
2015/12/28 PHP
来自chinaz的ajax获取评论代码
2008/05/03 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
NodeJs中的非阻塞方法介绍
2012/06/05 NodeJs
Javascript this 的一些学习总结
2012/08/02 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
js设置组合快捷键/tabindex功能的方法
2013/11/21 Javascript
EasyUI实现二级页面的内容勾选的方法
2015/03/01 Javascript
JavaScript程序设计之JS调试
2015/12/09 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
2016/06/08 Javascript
javascript判断firebug是否开启的方法
2016/11/23 Javascript
jquery 判断是否支持Placeholder属性的方法
2017/02/07 Javascript
mac上node.js环境的安装测试
2017/07/03 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
微信小程序--特定区域滚动到顶部时固定的方法
2019/04/28 Javascript
解决layui数据表格Date日期格式的回显Object的问题
2019/09/19 Javascript
javascript实现移动端红包雨页面
2020/06/23 Javascript
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
浅谈五大Python Web框架
2017/03/20 Python
python画出三角形外接圆和内切圆的方法
2018/01/25 Python
python使用mitmproxy抓取浏览器请求的方法
2019/07/02 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
聊聊python中的循环遍历
2020/09/07 Python
HTML5 visibilityState属性详细介绍和使用实例
2014/05/03 HTML / CSS
波兰购物网站:MALL.PL
2019/05/01 全球购物
李维斯牛仔裤英国官方网站:Levi’s英国
2019/10/10 全球购物
护理专业学生职业生涯规划范文
2014/03/11 职场文书
一分钟演讲稿
2014/04/30 职场文书
兴趣小组活动总结
2014/05/05 职场文书
违反工作规定检讨书范文
2014/12/14 职场文书
法定代表人资格证明书
2015/06/18 职场文书
Java设计模式之代理模式
2022/04/22 Java/Android