文件上传之上传至服务器(三)

把文件传送给服务器,一般有两种方案:FormDtata / BASE64

本文使用 FormData,BASE64 后续会更新

1. 封装跨域请求,限制文件上传的大小

//中间件
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*')
  req.method === 'OPTIONS' ? res.send('CURRENT SERVICES SUPPORT CROSS DOMAIN REQUESTS!'): next()
})
app.use(bodyParser.urlencoded({
  extended: false,
  limit: '1024mb'
}))

路由函数:

//req :客户端传的信息,res: 需要给客户端返回的信息
exports.userHome = async (req, res) => {
  try {
    let {
      files, fields
    } = await multiparty_upload(req, true)

    let file = (files.file && files.file[0]) || {}
    res.send({
      code: 0,
      codeText: 'upload succes',
      originalFilename: file.originalFilename,
      servicePath: file.path.replace(__dirname, HOSTNAME)
    })
  } catch (err) {
    res.send({
      code: 1,
      codeText: err,
    })
  }
}

基于multiparty 插件实现文件上传处理 & form-data 解析函数:

//基于multiparty 插件实现文件上传处理 & form-data 解析
const uploadDir = `${__dirname}/upload`
const multiparty_upload = function (req, auto){
  typeof auto !== 'boolean' ? auto = false : null
  let config = {
    maxFieldsSize: 200 * 1024 * 1024,
  };
  if (auto) config.uploadDir = uploadDir;
  return new Promise(async (resolve, reject) => {
    // await delay();,这是延时函数
    //解析req传过来的formData对象, fields包含filename,files 是客户端传过来的文件对象
    new multiparty.Form(config).parse(req, (err, fields, files) => {
      if (err) {
        //通过reject 控制promise 为失败的
        reject(err)
        return
      }
      resolve({
        fields,
        files
      })
    })
  })
}

完整后端接口代码:

//导包
const fs = require('fs')
const bodyParser = require('body-parser')
const multiparty = require('multiparty')
const SparkMD5 = require('spark-md5')

//基于multiparty 插件实现文件上传处理 & form-data 解析
const uploadDir = `${__dirname}/upload`
const multiparty_upload = function (req, auto){
  typeof auto !== 'boolean' ? auto = false : null
  let config = {
    maxFieldsSize: 200 * 1024 * 1024,
  };
  if (auto) config.uploadDir = uploadDir;
  return new Promise(async (resolve, reject) => {
    // await delay();,这是延时函数
    //解析req传过来的formData对象, fields包含filename,files 是客户端传过来的文件对象
    new multiparty.Form(config).parse(req, (err, fields, files) => {
      if (err) {
        //通过reject 控制promise 为失败的
        reject(err)
        return
      }
      resolve({
        fields,
        files
      })
    })
  })
}

//注册用户的处理函数
//req :客户端传的信息,res: 需要给客户端返回的信息
exports.userHome = async (req, res) => {
  try {
    let {
      files, fields
    } = await multiparty_upload(req, true)

    let file = (files.file && files.file[0]) || {}
    res.send({
      code: 0,
      codeText: 'upload succes',
      originalFilename: file.originalFilename,
      servicePath: file.path.replace(__dirname, HOSTNAME)
    })
  } catch (err) {
    res.send({
      code: 1,
      codeText: err,
    })
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值