Rumah >hujung hadapan web >tutorial js >Analisis ringkas tentang cara modul http dalam Node mengendalikan muat naik fail
Bagaimana untuk menggunakan modul http Node.js untuk memproses muat naik fail? Artikel berikut akan melihat cara memproses fail yang dimuat naik oleh bahagian hadapan pada bahagian pelayan. Saya harap ia akan membantu semua orang!
Jika data yang kami hantar ke pelayan sekarang adalah seperti yang ditunjukkan dalam rajah di bawah, ia mengandungi biasa maklumat medan name
dan fail imej file
:
Mari lihat dahulu cara menerima data muat naik fail pada pelayan dan mencetaknya pada konsol penyahpepijatan:
const http = require('http') const server = http.createServer((req, res) => { req.setEncoding('binary') req.on('data', data => { console.log(data) }) req.on('end', () => { console.log('上传结束') res.end('上传成功') }) }) server.listen(3010, () => console.log('服务器开启'))
Untuk memahami hasil cetakan, kami menetapkan pengekodan aksara kepada req.setEncoding('binary')
melalui 'binary'
, supaya data yang diperolehi bukan objek penimbal tetapi rentetan yang dikodkan ASCII Kami akan Anda boleh gunakan beberapa kaedah rentetan untuk memproses data.
Tetapi apabila saiz fail agak besar, data yang diperoleh tidak dapat dipaparkan sepenuhnya pada konsol dengan menaip terus nod atau nodemon pada baris arahan untuk menjalankan kod. Jadi kita boleh meletakkan titik putus di mana kita ingin mencetak data permintaan dan menjalankan kod melalui mod nyahpepijat:
Selepas mengklik "Jalankan dan Nyahpepijat", vs kod akan membantu Kami menjalankan pelayan:
Selepas itu, apabila kami menghantar permintaan muat naik, klik "Single Step Skip" di sudut kanan atas gambar di bawah untuk melihat permintaan . Data - maklumat yang boleh disusun oleh ASCII, seperti huruf Inggeris, boleh dilihat secara langsung, manakala data gambar adalah sekumpulan aksara bercelaru:
The langkah seterusnya ialah Memproses data permintaan yang diperoleh, memintas data imej di dalam dan kemudian menjana imej dengan menulis ke strim.
Dapatkan data imej
Kerana boleh Peristiwa strim baca 'data'
boleh membaca sehingga 64kb data pada satu masa Apabila imej besar, ia mungkin dicetuskan beberapa kali, jadi kami mentakrifkan pembolehubah reqData
untuk menyimpan data yang dihantar oleh. permintaan:
let reqData = '' req.on('data', data => { reqData += data }) req.on('end', () => { console.log(reqData) // 在这行打断点 res.end('上传成功') })
Apabila req
mencetuskan acara 'end'
, ia menunjukkan bahawa data yang diminta telah dibaca Jika anda menetapkan titik putus pada console.log(reqData)
dalam baris 6 kod di atas, dan kemudian lihat reqData
, data yang diperoleh adalah seperti berikut:
Data gambar hendaklah bahagian antara image/pngrnrn
dan rn----------------------------158329774739626517859573--rn
. Kita boleh mendapatkan indeks kedudukan permulaan (imgDataStartIndex
) dan penamat (imgDataEndIndex
) bagi data imej, kemudian gunakan substring()
untuk membuat pemintasan, dan akhirnya gunakan kaedah trim()
untuk mengalih keluar ruang pertama rn
:
const imgType = 'image/png' const imgDataStartIndex = reqData.indexOf(imgType) + imgType.length const imgDataEndIndex = reqData.indexOf(`--${boundary}--`) const imgData = reqData.substring(imgDataStartIndex, imgDataEndIndex).trim()
--------------------------158329774739626517859573
ialah pembatas (sempadan) yang dijana secara rawak oleh pelanggan dan digunakan untuk memisahkan setiap bahagian data dalam borang. Setiap item borang mempunyai permulaan dan penghujung, dan dua tanda tolak --
ditambah di hadapan permulaan, dan dua tanda tolak ditambah pada penghujung keseluruhan data borang. Semak pengepala permintaan:
Anda boleh mendapati bahawa content-type
ditakrifkan dalam boundary
, jadi kita boleh menggunakan kaedah berikut untuk mendapatkan pemisah:
const boundary = req.headers['content-type'].split('boundary=')[1]
Jana imej
Selepas mendapatkan data imejimgData
, anda boleh menulis fail untuk menjana imej melalui fs's writeFile()
:
fs.writeFile('./img.png', imgData, 'binary', err => { if (!err) console.log('图片写入成功') })
Perhatikan bahawa anda perlu memasukkan 'binary'
dalam parameter ketiga untuk menetapkan encoding
.
Kod tersebut kini diringkaskan seperti berikut:
const http = require('http') const fs = require('fs') const server = http.createServer((req, res) => { req.setEncoding('binary') const boundary = req.headers['content-type'].split('boundary=')[1] let reqData = '' req.on('data', data => { reqData += data }) req.on('end', () => { const imgType = 'image/png' const imgDataStartIndex = reqData.indexOf(imgType) + imgType.length const imgDataEndIndex = reqData.indexOf(`--${boundary}--`) const imgData = reqData.substring(imgDataStartIndex, imgDataEndIndex).trim() fs.writeFile('./img.png', imgData, 'binary', err => { if (!err) console.log('图片写入成功') }) res.end('上传成功') }) }) server.listen(3010, () => console.log('服务器开启'))
上述代码能够成功运行还有一些限制,比如只能处理单文件上传,且文件需要是 png 格式的图片,并且放在表单最后一项。文章的目的在于简单了解使用 node 的 http 模块搭建的服务器大体上是如何处理上传文件的请求的,为将来深入学习其它基于 http 模块的框架(express.js、koa.js 等)打好基础。
更多node相关知识,请访问:nodejs 教程!
Atas ialah kandungan terperinci Analisis ringkas tentang cara modul http dalam Node mengendalikan muat naik fail. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!