当前位置: 移动技术网 > IT编程>开发语言>JavaScript > node中间层实现文件上传功能

node中间层实现文件上传功能

2018年08月12日  | 移动技术网IT编程  | 我要评论
一般情况下,前端的文件上传一般都是通过form表单的(<input type="file" />)来完成文件的上传,如果使用node中间层完成跨域,文件的上传就

一般情况下,前端的文件上传一般都是通过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中间层实现文件上传功能,希望对大家有所帮助

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网