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 相关文章推荐
javascript 年月日联动实现核心代码
Dec 21 Javascript
jQueryPad 实用的jQuery测试工具(支持IE,chrome,FF)
May 22 Javascript
Jquery知识点一 Jquery的ready和Dom的onload的区别
Jan 15 Javascript
jQuery的.live()和.die() 使用介绍
Sep 10 Javascript
JavaScript实现水平进度条拖拽效果
Jan 18 Javascript
JavaScript实现翻页功能(附效果图)
Feb 16 Javascript
vue如何通过id从列表页跳转到对应的详情页
May 01 Javascript
最后说说Vue2 SSR 的 Cookies 问题
May 25 Javascript
微信小程序实现的点击按钮 弹出底部上拉菜单功能示例
Dec 20 Javascript
深入学习JavaScript中的bom
May 27 Javascript
JS实现水平遍历和嵌套递归操作示例
Aug 15 Javascript
node.js通过url读取文件
Oct 16 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也可以?成Shell Script
2006/10/09 PHP
PHP中常用数组处理方法实例分析
2008/08/30 PHP
PHP计划任务、定时执行任务的实现代码
2011/04/23 PHP
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
基于jquery的当鼠标滚轮到最底端继续加载新数据思路分享(多用于微博、空间、论坛 )
2011/10/10 Javascript
js Html结构转字符串形式显示代码
2011/11/15 Javascript
JS如何判断移动端访问设备并解析对应CSS
2013/11/27 Javascript
深入解析JavaScript中的变量作用域
2013/12/06 Javascript
用nodeJS搭建本地文件服务器的几种方法小结
2017/03/16 NodeJs
js实现拖拽上传图片功能
2017/08/01 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
vue+elementui 对话框取消 表单验证重置示例
2019/10/29 Javascript
[01:38]【DOTA2亚洲邀请赛】Sumail——梦开始的地方
2017/03/03 DOTA
Python中常见的数据类型小结
2015/08/29 Python
python列表的常用操作方法小结
2016/05/21 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
python批量下载抖音视频
2019/06/17 Python
python多线程共享变量的使用和效率方法
2019/07/16 Python
Flask框架学习笔记之使用Flask实现表单开发详解
2019/08/12 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
结合CSS3的新特性来总结垂直居中的实现方法
2016/05/30 HTML / CSS
Aveda美国官网:天然护发产品、洗发水、护发素和沙龙
2016/12/09 全球购物
Bandier官网:奢侈、时尚前卫的健身服装首选目的地
2020/07/05 全球购物
2019年Java面试必问之经典试题
2012/09/12 面试题
sort命令的作用和用法
2012/11/04 面试题
家长学校工作方案
2014/05/07 职场文书
店铺转让协议书
2015/01/29 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
新郎结婚感言
2015/07/31 职场文书
小学中队委竞选稿
2015/11/20 职场文书
2016简历自荐信优秀范文
2016/01/29 职场文书
SpringBoot整合JWT的入门指南
2021/06/29 Java/Android