把文件传送给服务器,一般有两种方案: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,
})
}
}