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 相关文章推荐
用js实现多域名不同文件的调用方法
Jan 12 Javascript
ext for eclipse插件安装方法
Apr 27 Javascript
js实现的map方法示例代码
Jan 13 Javascript
初识Node.js
Mar 20 Javascript
js使用onmousemove和onmouseout获取鼠标坐标的方法
Mar 31 Javascript
详解JavaScript常量定义
Jan 03 Javascript
JavaScript实现分页效果
Mar 28 Javascript
基于Vue实现后台系统权限控制的示例代码
Aug 29 Javascript
JavaScript使用递归和循环实现阶乘的实例代码
Aug 28 Javascript
JavaScript实现无限级递归树的示例代码
Mar 29 Javascript
微信小程序实现卡片层叠滑动效果
Jun 21 Javascript
JavaScript原型链中函数和对象的理解
Jun 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插入排序实现代码
2013/04/04 PHP
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
浅谈PHPANALYSIS提取关键字
2019/03/08 PHP
php解决crontab定时任务不能写入文件问题的方法分析
2019/09/16 PHP
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
JS简单限制textarea内输入字符数量的方法
2015/10/14 Javascript
Treegrid的动态加载实例代码
2016/04/29 Javascript
AngularJS  $on、$emit和$broadcast的使用
2016/09/05 Javascript
微信小程序 MINA文件结构
2016/10/17 Javascript
JS中位置与大小的获取方法
2016/11/22 Javascript
微信小程序 本地存储及登录页面处理实例详解
2017/01/11 Javascript
微信小程序利用co处理异步流程的方法教程
2017/05/20 Javascript
如何将你的AngularJS1.x应用迁移至React的方法
2018/02/01 Javascript
聊聊鉴权那些事(推荐)
2019/08/22 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
js实现简易计算器小功能
2020/11/18 Javascript
Python 流程控制实例代码
2009/09/25 Python
探究Python的Tornado框架对子域名和泛域名的支持
2015/05/02 Python
详解Python Opencv和PIL读取图像文件的差别
2019/12/27 Python
Python进阶之迭代器与迭代器切片教程
2020/01/29 Python
使用keras实现Precise, Recall, F1-socre方式
2020/06/15 Python
python学习笔记之多进程
2020/08/06 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
基于CSS3实现的黑色个性导航菜单效果
2015/09/14 HTML / CSS
匈牙利墨盒和碳粉购买网站:CDRmarket
2018/04/14 全球购物
解决方案设计综合面试题
2015/08/31 面试题
一体化教学实施方案
2014/05/10 职场文书
环保建议书200字
2014/05/14 职场文书
品牌服务方案
2014/06/03 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
污水处理保证书
2015/05/09 职场文书
团结主题班会
2015/08/13 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
浅谈Python魔法方法
2021/06/28 Java/Android