http模块-上传文件的正确做法

2021-03-07  本文已影响0人  静昕妈妈芦培培
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
上一篇 下一篇

猜你喜欢

热点阅读