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 相关文章推荐
fckeditor 获取文本框值的实现代码
Feb 09 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
Feb 25 Javascript
原生js实现类似弹窗抖动效果
Apr 02 Javascript
js实现仿百度风云榜可重复多次调用的TAB切换选项卡效果
Aug 31 Javascript
jQuery下拉菜单的实现代码
Nov 03 Javascript
js实现获取鼠标当前的位置
Dec 14 Javascript
静态页面实现 include 引入公用代码的示例
Sep 25 Javascript
dropload.js插件下拉刷新和上拉加载使用详解
Oct 20 Javascript
javaScript手机号码校验工具类PhoneUtils详解
Dec 08 Javascript
Node.js模拟发起http请求从异步转同步的5种用法
Sep 26 Javascript
微信小程序实现通过双向滑动缩放图片大小的方法
Dec 30 Javascript
基于JavaScript实现单例模式
Oct 30 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 __autoload()方法真的影响性能吗?
2012/03/30 PHP
PHP使用Mysqli类库实现完美分页效果的方法
2016/04/07 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
PDO::inTransaction讲解
2019/01/28 PHP
JavaScript多线程的实现方法
2007/05/08 Javascript
JavaScript 撑出页面文字换行
2009/06/15 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
中国地区三级联动下拉菜单效果分析
2012/11/15 Javascript
js身份证判断方法支持15位和18位
2014/03/18 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
jQuery中table数据的值拷贝和拆分
2017/03/19 Javascript
Angular directive递归实现目录树结构代码实例
2017/05/05 Javascript
vue监听input标签的value值方法
2018/08/27 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
使用python3.5仿微软记事本notepad
2016/06/15 Python
pandas多级分组实现排序的方法
2018/04/20 Python
Python3实现的简单工资管理系统示例
2019/03/12 Python
Python基于unittest实现测试用例执行
2020/11/25 Python
详解CSS3 Media Queries中媒体属性的使用
2016/02/29 HTML / CSS
深入浅析CSS3中的Flex布局整理
2020/04/27 HTML / CSS
详解HTML5中表单验证的8种方法介绍
2016/12/19 HTML / CSS
北美三大旅游网站之一:Travelocity加拿大
2016/08/20 全球购物
个人简历中的自我评价范例
2013/10/29 职场文书
最新自我评价范文
2013/11/16 职场文书
门卫岗位安全职责
2013/12/13 职场文书
应届生如何写自荐信
2014/01/05 职场文书
房屋公证委托书
2014/04/03 职场文书
创先争优活动承诺书
2014/08/30 职场文书
新党章心得体会
2014/09/04 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
反腐倡廉主题教育活动总结
2015/05/07 职场文书
2015年小学总务工作总结
2015/07/21 职场文书
执行力心得体会范文
2016/01/11 职场文书
七年级作文之雪景
2019/11/18 职场文书
解决Nginx 配置 proxy_pass 后 返回404问题
2021/03/31 Servers
浅谈Python响应式类库RxPy
2021/06/14 Python