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 相关文章推荐
IE不出现Flash激活框的小发现的js实现方法
Sep 07 Javascript
JS对img标签进行优化使用onerror显示默认图像
Apr 24 Javascript
javascript实现根据时间段显示问候语的方法
Jun 18 Javascript
js中遍历对象的属性和值的方法
Jul 27 Javascript
JS常用倒计时代码实例总结
Feb 07 Javascript
Vue响应式添加、修改数组和对象的值
Mar 20 Javascript
详解react服务端渲染(同构)的方法
Sep 21 Javascript
基于vue2.x的电商图片放大镜插件的使用
Jan 22 Javascript
JavaScript中的事件与异常捕获详析
Feb 24 Javascript
详解vue 在移动端体验上的优化解决方案
May 20 Javascript
js实现橱窗展示效果
Jan 11 Javascript
Jquery使用each函数实现遍历及数组处理
Jul 14 jQuery
几个你不知道的技巧助你写出更优雅的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中使用Oracle数据库(2)
2006/10/09 PHP
PHP 开发环境配置(测试开发环境)
2010/04/28 PHP
php设计模式 Visitor 访问者模式
2011/06/28 PHP
jquery获取选中的文本和值的方法
2014/07/08 Javascript
Bootstrap每天必学之标签与徽章
2015/11/27 Javascript
JS组件Form表单验证神器BootstrapValidator
2016/01/26 Javascript
浅谈JavaScript中面向对象的的深拷贝和浅拷贝
2016/08/01 Javascript
使用JS代码实现点击按钮下载文件
2016/11/12 Javascript
Mongoose经常返回e11000 error的原因分析
2017/03/29 Javascript
Nodejs中使用captchapng模块生成图片验证码
2017/05/18 NodeJs
详解angularJS动态生成的页面中ng-click无效解决办法
2017/06/19 Javascript
BootStrap Fileinput插件和Bootstrap table表格插件相结合实现文件上传、预览、提交的导入Excel数据操作步骤
2017/08/07 Javascript
纯js实现图片匀速淡入淡出效果
2017/08/22 Javascript
jQury Ajax使用Token验证身份实例代码
2017/09/22 Javascript
vue 自定义 select内置组件
2018/04/10 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
JS滚轮控制图片缩放大小和拖动的实例代码
2018/11/20 Javascript
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
[03:21]辉夜杯主赛事 12月25日TOP5
2015/12/26 DOTA
最基础的Python的socket编程入门教程
2015/04/23 Python
Linux(Redhat)安装python3.6虚拟环境(推荐)
2018/05/05 Python
5分钟 Pipenv 上手指南
2018/12/20 Python
Python实现简单层次聚类算法以及可视化
2019/03/18 Python
pandas DataFrame 行列索引及值的获取的方法
2019/07/02 Python
解决python对齐错误的方法
2020/07/16 Python
劳动竞赛活动方案
2014/02/20 职场文书
追悼会主持词
2014/03/20 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
升学宴学生答谢词
2015/01/05 职场文书
公司2015年终工作总结
2015/05/26 职场文书
小学生禁毒教育心得体会
2016/01/15 职场文书
爱国之歌(8首)
2019/09/29 职场文书
祝福语集锦:给满月宝宝的祝福语
2019/11/20 职场文书
springboot临时文件存储目录配置方式
2021/07/01 Java/Android
python 安全地删除列表元素的方法
2022/03/16 Python
一次Mysql update sql不当引起的生产故障记录
2022/04/01 MySQL