Inhaltsverzeichnis
Anfragedaten anzeigen
处理文件(图片)数据
获取分隔符 boundary
🎜Get the Trennzeichen Grenze🎜
Heim Web-Frontend js-Tutorial Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet

Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet

Mar 09, 2023 pm 07:37 PM
node http模块

Wie verwende ich das http-Modul von Node.js, um Datei-Uploads zu verarbeiten? Der folgende Artikel befasst sich mit der Verarbeitung von Dateien, die vom Frontend auf der Serverseite hochgeladen werden. Ich hoffe, er ist für alle hilfreich!

Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet

Anfragedaten anzeigen

Wenn die Daten, die wir jetzt an den Server senden, wie in der Abbildung unten dargestellt sind, enthalten sie normale Feldinformationen name und eine Bilddatei file code>:<code>name 以及一个图片文件 file

Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet

我们先来看看如何在服务器接收到文件上传的数据,并在调试控制台打印查看:

const http = require(&#39;http&#39;)
const server = http.createServer((req, res) => {
  req.setEncoding(&#39;binary&#39;)
  req.on(&#39;data&#39;, data => {
    console.log(data)
  })
  req.on(&#39;end&#39;, () => {
    console.log(&#39;上传结束&#39;)
    res.end(&#39;上传成功&#39;)
  })
})
server.listen(3010, () => console.log(&#39;服务器开启&#39;))
Nach dem Login kopieren

想要能看懂打印的结果,我们通过 req.setEncoding(&#39;binary&#39;) 设置了字符编码为 &#39;binary&#39;,这样得到的数据就不是 buffer 对象而是 ASCII 编码后的字符串,我们就可以使用一些字符串的方法来处理数据了。

但是当文件大小比较大时,直接通过在命令行输入 node 或 nodemon 来运行代码,得到的数据无法完全在控制台展示。所以我们可以在要打印请求数据的地方打上断点,通过 debugger 的模式来运行代码:

Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet

点击 "运行和调试" 后,vs code 就会帮我们把服务器运行起来了:

Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet

之后当我们发送了上传的请求,再点击下图右上角的 "单步跳过",就可以看到请求的数据了 —— 那些可以被 ASCII 编译的信息,比如英文字母,可以直接看到了,而图片的数据则是一堆乱码:

Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet

接下来就是处理获取的请求数据,将里面的图片数据截取出来然后通过写入流生成图片。

处理文件(图片)数据

获取图片数据

因为可读流&#39;data&#39; 事件一次最多读取 64kb 的数据,当图片比较大时,可能会触发多次,所以我们定义变量 reqData 来存储请求发来的数据:

let reqData = &#39;&#39;
req.on(&#39;data&#39;, data => {
  reqData += data
})
req.on(&#39;end&#39;, () => {
  console.log(reqData) // 在这行打断点
  res.end(&#39;上传成功&#39;)
})
Nach dem Login kopieren

req 触发了 &#39;end&#39; 事件说明请求数据读取完毕,如果在上列代码的第 6 行 console.log(reqData) 处打个断点,然后查看 reqData,得到的数据如下:

Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet

图片的数据应该是 image/pngrnrnrn----------------------------158329774739626517859573--rn 中间这段。我们可以去获取图片数据的起(imgDataStartIndex)止(imgDataEndIndex)位置的 index,然后使用 substring() 做个截取,最后再使用 trim() 方法去除首位的空格 rn

const imgType = &#39;image/png&#39;
const imgDataStartIndex = reqData.indexOf(imgType) + imgType.length
const imgDataEndIndex = reqData.indexOf(`--${boundary}--`)
const imgData = reqData.substring(imgDataStartIndex, imgDataEndIndex).trim()
Nach dem Login kopieren

获取分隔符 boundary

--------------------------158329774739626517859573是客户端随机生成的,用于分割表单里的每段数据的分隔符(boundary),在每个表单项的开头和结尾都有,并且在开头处的前面都会加上两个减号 --,在整个表单数据结束处的末尾也会加上两个减号。查看请求头:

Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet

可以发现在 content-type 里定义了boundary,于是我们可以使用如下方法获取分隔符:

const boundary = req.headers[&#39;content-type&#39;].split(&#39;boundary=&#39;)[1]
Nach dem Login kopieren

生成图片

获取到了图片数据 imgData 后,就可以通过 fswriteFile() 写入文件生成图片了:

fs.writeFile(&#39;./img.png&#39;, imgData, &#39;binary&#39;, err => {
  if (!err) console.log(&#39;图片写入成功&#39;)
})
Nach dem Login kopieren

注意需要在第三个参数传入&#39;binary&#39; 来设定 encoding

Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet

Schauen wir uns zunächst an, wie man die Datei-Upload-Daten auf dem Server empfängt und auf der Debugging-Konsole ausdruckt:
const http = require('http')
const fs = require('fs')

const server = http.createServer((req, res) => {
  req.setEncoding(&#39;binary&#39;)
  const boundary = req.headers[&#39;content-type&#39;].split(&#39;boundary=&#39;)[1]
  let reqData = ''
  req.on(&#39;data&#39;, data => {
    reqData += data
  })
  req.on(&#39;end&#39;, () => {
    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, &#39;binary&#39;, err => {
      if (!err) console.log('图片写入成功')
    })
    res.end('上传成功')
  })
})

server.listen(3010, () => console.log('服务器开启'))
Nach dem Login kopieren
Nach dem Login kopieren

Wenn wir die gedruckten Ergebnisse verstehen wollen, übergeben wir req.setEncoding(' binär') Stellen Sie die Zeichenkodierung auf 'binär' ein, sodass die erhaltenen Daten kein Pufferobjekt, sondern eine ASCII-codierte Zeichenfolge sind. Wir können einige Zeichenfolgenmethoden verwenden, um die Daten zu verarbeiten . .

Aber wenn die Dateigröße relativ groß ist, können die erhaltenen Daten nicht vollständig auf der Konsole angezeigt werden, indem Sie direkt „node“ oder „nodemon“ in die Befehlszeile eingeben, um den Code auszuführen. Wir können also einen Haltepunkt setzen, an dem wir die Anforderungsdaten drucken möchten, und den Code im Debugger-Modus ausführen: 🎜🎜Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet🎜🎜Nach dem Klicken auf „Ausführen und Debuggen“ hilft uns der vs-Code beim Ausführen des Servers: 🎜🎜Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet🎜🎜Danach, wenn wir die Upload-Anfrage senden, klicken Sie auf „ „Einzelschritt überspringen“ in der oberen rechten Ecke des Bildes unten, um die angeforderten Daten anzuzeigen – Informationen, die durch ASCII kompiliert werden können, wie z. B. englische Buchstaben, können direkt gesehen werden, während die Daten im Bild ein Haufen verstümmelter Zeichen sind: 🎜🎜Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet🎜🎜Verbinden Der nächste Schritt besteht darin, die erhaltenen Anforderungsdaten zu verarbeiten, die darin enthaltenen Bilddaten abzufangen und dann das Bild durch Schreiben in den Stream zu generieren. 🎜🎜🎜Dateidaten (Bilddaten) werden verarbeitet🎜🎜🎜🎜Bilddaten abrufen🎜🎜🎜Weil Das Ereignis 'data' des lesbaren Streams kann bis zu 64 KB lesen Wenn das Bild relativ groß ist, können Zeitdaten mehrmals ausgelöst werden. Daher definieren wir die Variable reqData, um die von der Anfrage gesendeten Daten zu speichern: 🎜rrreee🎜Wenn req</code > löst <code >'end' aus Ereignisbeschreibung Die angeforderten Daten wurden gelesen, wenn Sie in Zeile 6 des obigen Codes console.log(reqData) einen Haltepunkt setzen und dann anzeigen reqData , die erhaltenen Daten lauten wie folgt: 🎜🎜Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet🎜🎜Die Daten des Bildes sollten image/pngrnrn und rn sein------------- -------- -------158329774739626517859573--rn Der mittlere Absatz. Wir können den Index der Start- (imgDataStartIndex) und Endpositionen (imgDataEndIndex) der Bilddaten abrufen und dann substring() verwenden, um Fangen Sie es ab und entfernen Sie schließlich mit der Methode trim() das führende Leerzeichen rn: 🎜rrreee

🎜Get the Trennzeichen Grenze🎜

🎜----------------------------------------158329774739626517859573 wird vom Client zufällig generiert und verwendet um jeden Absatz im Formular zu teilen. Das Datentrennzeichen (Grenze) befindet sich am Anfang und am Ende jedes Formularelements, und zwei Minuszeichen -- werden vor dem Anfang und am Ende hinzugefügt der gesamten Formulardaten. Am Ende stehen außerdem zwei Minuszeichen. Sehen Sie sich den Anforderungsheader an: 🎜🎜Eine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet🎜🎜Sie können feststellen, dass boundary in content-type definiert ist, sodass wir die folgende Methode verwenden können, um das Trennzeichen zu erhalten: 🎜rrreee🎜🎜Bild generieren🎜🎜🎜Nachdem Sie die Bilddaten imgData erhalten haben, können Sie fss writeFile() schreibt die Datei, um das Bild zu generieren: 🎜rrreee 🎜Beachten Sie, dass es im dritten Parameter in 'binary' übergeben werden muss, um encoding festzulegen. 🎜🎜🎜Zusammenfassung🎜🎜🎜Jetzt wird der Code wie folgt zusammengefasst:🎜
const http = require('http')
const fs = require('fs')

const server = http.createServer((req, res) => {
  req.setEncoding(&#39;binary&#39;)
  const boundary = req.headers[&#39;content-type&#39;].split(&#39;boundary=&#39;)[1]
  let reqData = ''
  req.on(&#39;data&#39;, data => {
    reqData += data
  })
  req.on(&#39;end&#39;, () => {
    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, &#39;binary&#39;, err => {
      if (!err) console.log('图片写入成功')
    })
    res.end('上传成功')
  })
})

server.listen(3010, () => console.log('服务器开启'))
Nach dem Login kopieren
Nach dem Login kopieren

上述代码能够成功运行还有一些限制,比如只能处理单文件上传,且文件需要是 png 格式的图片,并且放在表单最后一项。文章的目的在于简单了解使用 node 的 http 模块搭建的服务器大体上是如何处理上传文件的请求的,为将来深入学习其它基于 http 模块的框架(express.js、koa.js 等)打好基础。

更多node相关知识,请访问:nodejs 教程

Das obige ist der detaillierte Inhalt vonEine kurze Analyse, wie das http-Modul in Node Datei-Uploads verarbeitet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

So löschen Sie einen Knoten in NVM So löschen Sie einen Knoten in NVM Dec 29, 2022 am 10:07 AM

So löschen Sie einen Knoten mit nvm: 1. Laden Sie „nvm-setup.zip“ herunter und installieren Sie es auf dem Laufwerk C. 2. Konfigurieren Sie Umgebungsvariablen und überprüfen Sie die Versionsnummer mit dem Befehl „nvm -v“. install“-Befehl Knoten installieren; 4. Löschen Sie den installierten Knoten über den Befehl „nvm uninstall“.

So verwenden Sie Express für den Datei-Upload im Knotenprojekt So verwenden Sie Express für den Datei-Upload im Knotenprojekt Mar 28, 2023 pm 07:28 PM

Wie gehe ich mit dem Datei-Upload um? Der folgende Artikel stellt Ihnen vor, wie Sie Express zum Hochladen von Dateien im Knotenprojekt verwenden. Ich hoffe, er ist hilfreich für Sie!

Wie führt man eine Docker-Spiegelung des Node-Dienstes durch? Detaillierte Erläuterung der ultimativen Optimierung Wie führt man eine Docker-Spiegelung des Node-Dienstes durch? Detaillierte Erläuterung der ultimativen Optimierung Oct 19, 2022 pm 07:38 PM

Während dieser Zeit habe ich einen dynamischen HTML-Dienst entwickelt, der allen Kategorien von Tencent-Dokumenten gemeinsam ist. Um die Generierung und Bereitstellung des Zugriffs auf verschiedene Kategorien zu erleichtern und dem Trend der Cloud-Migration zu folgen, habe ich über die Verwendung von Docker nachgedacht Serviceinhalte verwalten und Produktversionen einheitlich verwalten. In diesem Artikel werden die Optimierungserfahrungen, die ich bei der Bereitstellung von Docker gesammelt habe, als Referenz weitergegeben.

Eine ausführliche Analyse des Prozessmanagement-Tools „pm2' von Node Eine ausführliche Analyse des Prozessmanagement-Tools „pm2' von Node Apr 03, 2023 pm 06:02 PM

In diesem Artikel stellen wir Ihnen das Prozessmanagement-Tool „pm2“ von Node vor und sprechen darüber, warum PM2 benötigt wird und wie Sie PM2 installieren und verwenden. Ich hoffe, dass es für alle hilfreich ist!

PI -Knotenunterricht: Was ist ein PI -Knoten? Wie installiere und richte ich einen PI -Knoten ein? PI -Knotenunterricht: Was ist ein PI -Knoten? Wie installiere und richte ich einen PI -Knoten ein? Mar 05, 2025 pm 05:57 PM

Detaillierte Erläuterungs- und Installationshandbuch für Pinetwork -Knoten In diesem Artikel wird das Pinetwork -Ökosystem im Detail vorgestellt - PI -Knoten, eine Schlüsselrolle im Pinetwork -Ökosystem und vollständige Schritte für die Installation und Konfiguration. Nach dem Start des Pinetwork -Blockchain -Testnetzes sind PI -Knoten zu einem wichtigen Bestandteil vieler Pioniere geworden, die aktiv an den Tests teilnehmen und sich auf die bevorstehende Hauptnetzwerkveröffentlichung vorbereiten. Wenn Sie Pinetwork noch nicht kennen, wenden Sie sich bitte an was Picoin ist? Was ist der Preis für die Auflistung? PI -Nutzung, Bergbau und Sicherheitsanalyse. Was ist Pinetwork? Das Pinetwork -Projekt begann 2019 und besitzt seine exklusive Kryptowährung PI -Münze. Das Projekt zielt darauf ab, eine zu erstellen, an der jeder teilnehmen kann

Lassen Sie uns darüber sprechen, wie Sie mit pkg Node.js-Projekte in ausführbare Dateien packen. Lassen Sie uns darüber sprechen, wie Sie mit pkg Node.js-Projekte in ausführbare Dateien packen. Dec 02, 2022 pm 09:06 PM

Wie packe ich die ausführbare Datei von nodejs mit pkg? Im folgenden Artikel erfahren Sie, wie Sie mit pkg ein Node-Projekt in eine ausführbare Datei packen. Ich hoffe, dass er Ihnen weiterhilft!

Tokenbasierte Authentifizierung mit Angular und Node Tokenbasierte Authentifizierung mit Angular und Node Sep 01, 2023 pm 02:01 PM

Die Authentifizierung ist einer der wichtigsten Teile jeder Webanwendung. In diesem Tutorial werden tokenbasierte Authentifizierungssysteme und ihre Unterschiede zu herkömmlichen Anmeldesystemen erläutert. Am Ende dieses Tutorials sehen Sie eine voll funktionsfähige Demo, die in Angular und Node.js geschrieben wurde. Traditionelle Authentifizierungssysteme Bevor wir zu tokenbasierten Authentifizierungssystemen übergehen, werfen wir einen Blick auf traditionelle Authentifizierungssysteme. Der Benutzer gibt seinen Benutzernamen und sein Passwort im Anmeldeformular ein und klickt auf „Anmelden“. Nachdem Sie die Anfrage gestellt haben, authentifizieren Sie den Benutzer im Backend, indem Sie die Datenbank abfragen. Wenn die Anfrage gültig ist, wird eine Sitzung mit den aus der Datenbank erhaltenen Benutzerinformationen erstellt und die Sitzungsinformationen werden im Antwortheader zurückgegeben, sodass die Sitzungs-ID im Browser gespeichert wird. Bietet Zugriff auf Anwendungen, die unterliegen

Was tun, wenn npm node gyp ausfällt? Was tun, wenn npm node gyp ausfällt? Dec 29, 2022 pm 02:42 PM

npm node gyp schlägt fehl, weil „node-gyp.js“ nicht mit der Version von „Node.js“ übereinstimmt. Die Lösung ist: 1. Löschen Sie den Knotencache über „npm cache clean -f“ 2. Über „npm install -“ g n“ Installieren Sie das n-Modul. 3. Installieren Sie die Version „node v12.21.0“ über den Befehl „n v12.21.0“.

See all articles