尝试使用axios的post方法直接给后端传File对象,出现500或者空对象问题
出错示例:
axios.post(URL, v.target.files[0])} />
解决方法:
Koa中的Koa-Body中间件需要开启multipart
配置前端上传File时使用FormData
后端通过ctx.request.files
来获取File
// 前端代码
function upload(file: File) {
const formData = new FormData()
// 后端使用ctx.request.files获取
formData.append('file', file)
// 其他值依旧可以使用formData传递,只不过后端使用ctx.request.body获取
// ...
axios.post(URL, formData)
}
<input type="file" onChange={v => upload(v.target.files[0])} />
// 后端框架部分
import * as Koa from 'koa'
import * as koaBody from 'koa-body'
const app = new Koa()
app.use(koaBody({ multipart: true }))
// ...
app.listen(config.port)
// api路由部分
import * as Router from 'koa-router'
router.post('/uploadFile', async ctx => {
const data = ctx.request.files
// 此时的data为 {file: File对象...}
// 可通过data.file获取File对象了
// ...
ctx.body = 'OK'
})
但是要注意,此时的变量data.file
是formidable.File
,不是浏览器下的File对象,也许不能直接上传到存储文件的云服务上,需要转成其他形式
解决方案:
在node.js环境下,formidable.File
是缓存在本机上的,此时变量data.file
有一个path
属性是本机的绝对地址,可以使用node.js的fs模块
读取该文件后再进行 *** 作,此时的变量bufferData
是Buffer
类型,后续可以直接对变量bufferData
进行其他 *** 作
import { readFileSync } from 'fs'
// ...
const data = ctx.request.files
// ...
const bufferData = readFileSync(data.file.path)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)