- Published on
Express使用二
- Authors
- Name
- Et cetera
首先介绍原生基于node.js中http模块上传文件
通过手动对接口返回数据流进行字符串剪切解析
const http = require('http') const fs = require('fs')
// 创建一个服务器
const server = http.createServer((req, res) => {
// 设置为二进制格式数据
req.setEncoding('binary')
const boundary = req.headers['content-type'].split('; ')[1].replace('boundary=', '')
// 因为客户端传递的数据是表单数据(请求体)
let formData = ''
req.on('data', (data) => {
console.log(data)
formData += data
})
req.on('end', () => {
console.log(formData)
const imgType = 'image/png'
const position = formData.indexOf(imgType) + imgType.length
let imageData = formData.substring(position)
// imageData开始位置会有两个空格
imageData = imageData.replace(/^\s\s*/, '')
// 替换最后的 boundary
imageData = imageData.substring(0, imageData.indexOf(`--${boundary}--`))
fs.writeFile('./client.png', imageData, 'binary', () => {
console.log('文件上传成功')
res.end('文件上传完毕')
})
})
})
server.listen(3000, () => {
console.log('localhost:3000 server success')
})
express实现文件上传
const express = require('express')
const multer = require('multer')
const app = express()
const port = 3000
// 注意最后生成的文件是可以浏览的,但是windows电脑上可能会因为没有后缀格式而无法查看,mac可以直接查看
// vscode中同样会因为没有后缀无法查看,可以手动添加后缀查看
// 使用一个 express 官方的中间件
const upload = multer({
storage: multer.diskStorage({
destination(req, file, callback) {
callback(null, './uploads')
},
filename(req, file, callback) {
callback(null, Date.now() + '_' + file.originalname)
},
}),
})
// 单文件上传 singer()
// upload.single(文件名) 客户端请求时文件的 key 值
app.post('/upload', upload.single('avatar'), (req, res, next) => {
console.log(req.file)
res.send('Hello World!')
})
app.post('/upload_files', upload.array('photos'), (req, res, next) => {
console.log(req.files)
res.send('上传成功!')
})
app.listen(port, () => console.log(`Example app listening on port ${port}!`))
koa实现文件上传
const Koa = require('koa')
const KoaRouter = require('@koa/router')
const multer = require('@koa/multer')
const app = new Koa()
const files = multer({
storage: multer.diskStorage({
destination(req, file, callback) {
callback(null, './uploads')
},
filename(req, file, callback) {
callback(null, Date.now() + '_' + file.originalname)
},
}),
})
const userRouter = new KoaRouter({ prefix: '/upload' })
// 单文件
userRouter.post('/file', files.single('avatar'), (ctx, next) => {
console.log(ctx.request.file)
ctx.body = 'form数据上传成功'
})
// post/form-data(file)
// 多文件
userRouter.post('/files', files.array('avatar'), (ctx, next) => {
console.log(ctx.request.files)
ctx.body = 'form数据上传成功'
})
app.use(userRouter.routes())
app.use(userRouter.allowedMethods())
app.listen(8000, () => {
console.log('Koa server successfully listening')
})