const fs = require('fs')
const http = require('http')
const qs = require('querystring')
//创建一个服务器,回调会被自动添加到request事件,也就是每当有请求的时候就会触发这个回调
const server = http.createServer((req, res) => {
const {pathname} = new URL(req.url, "http://localhost:8888/")
if(pathname === '/upload' && req.method === 'POST') {
//一定要设置编码
req.setEncoding('binary')
let boundary = req.headers['content-type'].split(';')[1].split('=')[1]
//读取请求主体
let reqBody = ''
req.on('data', (chunk) => {
reqBody += chunk
})
req.on('end', (chunk) => {
// console.log(reqBody)
//拿到图片类型
const payload = qs.parse(reqBody, '\r\n', ": ")
const type = (payload["Content-Type"])
//拿到type再reqBody中所在的位置
let typeIndex = reqBody.indexOf(type)
let len = type.length
//把文件类型以及文件类型之前的字符截取掉,保留之后的字符保存到imgData
let imgData = reqBody.substring(typeIndex + len)
//把imgData前面的两个空格去掉
imgData = imgData.replace(/^\s\s*/, '')
//将最后面的boundary及boundary前后的连个--去掉
imgData = imgData.substring(0, imgData.indexOf(`--${boundary}--`))
fs.writeFile('./foo.jpg', imgData, 'binary', (err) => {
if(err) {
console.error(err)
return
}
//1.设置响应header
//方法一:
// res.statusCode = 200
// res.setHeader('Content-Type', 'text/plain;charset=utf8')
//方法二:
res.writeHead(200, {
"Content-Type": "text/html;charset=utf8"
})
//2.设置响应结果
res.write('<h1>文件上传成功</h1>')
// 必须在每个响应上调用此 response.end() 方法,告诉服务器此消息已完成
res.end()
})
})
}
})
//开启服务器,并且指定监听的端口号和主机,当服务器开启成功的时候会执行回调函数,这个函数是异步的。
server.listen(8888, '0.0.0.0', () => {
console.log('服务器启动成功')
})
启动服务器:
image.png image.png
结果:
image.png
网友评论