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 相关文章推荐
fancybox modal的完美解决(右上的X)
Oct 30 Javascript
js判断浏览器类型的方法
Aug 07 Javascript
document.write()及其输出内容的样式、位置控制
Aug 12 Javascript
javascript实现通过表格绘制颜色填充矩形的方法
Apr 21 Javascript
使用JS读取XML文件的方法
Nov 25 Javascript
JS表格组件神器bootstrap table使用指南详解
Apr 12 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
Sep 07 Javascript
vue如何解决循环引用组件报错的问题
Sep 22 Javascript
layui之table checkbox初始化时选中对应选项的方法
Sep 02 Javascript
Windows上node.js的多版本管理工具用法实例分析
Nov 06 Javascript
VUE中V-IF条件判断改变元素的样式操作
Aug 09 Javascript
vue3中轻松实现switch功能组件的全过程
Jan 07 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
精通php的十大要点(上)
2009/02/04 PHP
PHPwind整合最土系统用户同步登录实现方法
2010/12/08 PHP
PHP中替换换行符的几种方法小结
2012/10/15 PHP
php数组中包含中文的排序方法
2014/06/03 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
php生成高清缩略图实例详解
2015/12/07 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
JS焦点图切换,上下翻转
2011/05/12 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
2012/03/01 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
jQuery 获取、设置HTML或TEXT内容的两种方法
2014/05/23 Javascript
jQuery实现在textarea指定位置插入字符或表情的方法
2015/03/11 Javascript
jquery实现的横向二级导航效果代码
2015/08/26 Javascript
基于JavaScript实现 网页切出 网站title变化代码
2016/04/03 Javascript
jQuery Easyui datagrid连续发送两次请求问题
2016/12/13 Javascript
Vue.js实战之组件之间的数据传递
2017/04/01 Javascript
Ionic2开发环境搭建教程
2020/08/20 Javascript
谈谈JS中的!!
2017/12/07 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
2019/01/07 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
JS实现json数组排序操作实例分析
2019/10/28 Javascript
[02:41]《西雅图我们来了》2015国际邀请赛出征全记录
2015/07/23 DOTA
Python基于有道实现英汉字典功能
2015/07/25 Python
python实现windows下文件备份脚本
2018/05/27 Python
django框架面向对象ORM模型继承用法实例分析
2019/07/29 Python
解决python Jupyter不能导入外部包问题
2020/04/15 Python
Python3之乱码\xe6\x97\xa0\xe6\xb3\x95处理方式
2020/05/11 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
英国标准协会商店:BSI Shop
2019/02/25 全球购物
会走路的树教学反思
2014/02/20 职场文书
食品安全处置方案
2014/06/14 职场文书
镇党政领导班子民主生活会思想汇报
2014/10/11 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
V Rising 服务器搭建图文教程
2022/06/16 Servers