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 相关文章推荐
jQuery的Ajax时无响应数据的解决方法
May 25 Javascript
EXTJS FORM HIDDEN TEXTFIELD 赋值 使用value不好用的问题
Apr 16 Javascript
基于jQuery实现的水平和垂直居中的div窗口
Aug 08 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
Dec 05 Javascript
js写的评论分页(还不错)
Dec 23 Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
Feb 24 Javascript
SeaJS入门教程系列之SeaJS介绍(一)
Mar 03 Javascript
jQuery如何使用自动触发事件trigger
Nov 29 Javascript
js判断某个字符出现的次数的简单实例
Jun 03 Javascript
JavaScript数据存储 Cookie篇
Jul 02 Javascript
微信小程序 页面跳转及数据传递详解
Mar 14 Javascript
js canvas实现QQ拨打电话特效
May 10 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制作静态网站的模板框架(一)
2006/10/09 PHP
APMServ使用说明
2006/10/23 PHP
《PHP边学边教》(01.开篇――准备工作)
2006/12/13 PHP
php定时删除文件夹下文件(清理缓存文件)
2013/01/23 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
JS DOM 操作实现代码
2010/08/01 Javascript
js简单实现HTML标签Select联动带跳转
2013/10/23 Javascript
Jquery AJAX POST与GET之间的区别
2013/11/14 Javascript
jQuery中extend()和fn.extend()方法详解
2015/06/03 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
js实现textarea限制输入字数
2017/02/13 Javascript
关于vue.js过渡css类名的理解(推荐)
2017/04/10 Javascript
详解Vue用自定义指令完成一个下拉菜单(select组件)
2017/10/31 Javascript
从零开始搭建一个react项目开发
2018/02/09 Javascript
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
ant-design-vue按需加载的坑的解决
2020/05/14 Javascript
JavaScript实现弹出窗口效果
2020/12/09 Javascript
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
python将人民币转换大写的脚本代码
2013/02/10 Python
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
python处理xml文件的方法小结
2017/05/02 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
Python中遍历列表的方法总结
2019/06/27 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
用python3读取python2的pickle数据方式
2019/12/25 Python
python空元组在all中返回结果详解
2020/12/15 Python
html5配合css3实现带提示文字的输入框(摆脱js)
2013/03/08 HTML / CSS
迪卡侬荷兰官网:Decathlon荷兰
2017/10/29 全球购物
欧洲顶级体育电子商务网站:SportsShoes.com
2018/03/27 全球购物
大学生志愿者感言
2014/01/15 职场文书
《锄禾》教学反思
2014/04/08 职场文书
2015年医务人员医德医风自我评价
2015/03/03 职场文书
合同补充协议书
2016/03/24 职场文书
MySQL 原理优化之Group By的优化技巧
2022/08/14 MySQL