Node의 http 모듈이 파일 업로드를 처리하는 방법에 대한 간략한 분석
Node.js의 http 모듈을 사용하여 파일 업로드를 처리하는 방법은 무엇입니까? 다음 글에서는 프런트 엔드에서 업로드한 파일을 서버 측에서 처리하는 방법을 살펴보겠습니다. 모든 분들께 도움이 되길 바랍니다!
요청 데이터 보기
지금 우리가 서버로 보내는 데이터가 아래 그림과 같다면, 일반 필드 정보 이름
과 이미지 파일 파일이 포함되어 있습니다. 코드>:<code>name
以及一个图片文件 file
:
我们先来看看如何在服务器接收到文件上传的数据,并在调试控制台打印查看:
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('服务器开启'))
想要能看懂打印的结果,我们通过 req.setEncoding('binary')
设置了字符编码为 'binary'
,这样得到的数据就不是 buffer 对象而是 ASCII 编码后的字符串,我们就可以使用一些字符串的方法来处理数据了。
但是当文件大小比较大时,直接通过在命令行输入 node 或 nodemon 来运行代码,得到的数据无法完全在控制台展示。所以我们可以在要打印请求数据的地方打上断点,通过 debugger 的模式来运行代码:
点击 "运行和调试" 后,vs code 就会帮我们把服务器运行起来了:
之后当我们发送了上传的请求,再点击下图右上角的 "单步跳过",就可以看到请求的数据了 —— 那些可以被 ASCII 编译的信息,比如英文字母,可以直接看到了,而图片的数据则是一堆乱码:
接下来就是处理获取的请求数据,将里面的图片数据截取出来然后通过写入流生成图片。
处理文件(图片)数据
获取图片数据
因为可读流的 'data'
事件一次最多读取 64kb 的数据,当图片比较大时,可能会触发多次,所以我们定义变量 reqData
来存储请求发来的数据:
let reqData = '' req.on('data', data => { reqData += data }) req.on('end', () => { console.log(reqData) // 在这行打断点 res.end('上传成功') })
当 req
触发了 'end'
事件说明请求数据读取完毕,如果在上列代码的第 6 行 console.log(reqData)
处打个断点,然后查看 reqData
,得到的数据如下:
图片的数据应该是 image/pngrnrn
与 rn----------------------------158329774739626517859573--rn
中间这段。我们可以去获取图片数据的起(imgDataStartIndex
)止(imgDataEndIndex
)位置的 index,然后使用 substring()
做个截取,最后再使用 trim()
方法去除首位的空格 rn
:
const imgType = 'image/png' const imgDataStartIndex = reqData.indexOf(imgType) + imgType.length const imgDataEndIndex = reqData.indexOf(`--${boundary}--`) const imgData = reqData.substring(imgDataStartIndex, imgDataEndIndex).trim()
获取分隔符 boundary
--------------------------158329774739626517859573
是客户端随机生成的,用于分割表单里的每段数据的分隔符(boundary),在每个表单项的开头和结尾都有,并且在开头处的前面都会加上两个减号 --
,在整个表单数据结束处的末尾也会加上两个减号。查看请求头:
可以发现在 content-type
里定义了boundary
,于是我们可以使用如下方法获取分隔符:
const boundary = req.headers['content-type'].split('boundary=')[1]
生成图片
获取到了图片数据 imgData
后,就可以通过 fs 的 writeFile()
写入文件生成图片了:
fs.writeFile('./img.png', imgData, 'binary', err => { if (!err) console.log('图片写入成功') })
注意需要在第三个参数传入'binary'
来设定 encoding

먼저 서버에 업로드된 파일 데이터를 받아 디버깅 콘솔에 인쇄하는 방법을 살펴보겠습니다. 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('服务器开启'))
로그인 후 복사로그인 후 복사
인쇄된 결과를 이해하려면 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('服务器开启'))
req.setEncoding(' 바이너리')
문자 인코딩을 '바이너리'
로 설정하여 얻은 데이터가 버퍼 개체가 아니라 ASCII로 인코딩된 문자열이 되도록 일부 문자열 메서드를 사용하여 데이터를 처리할 수 있습니다. . 그러나 파일 크기가 상대적으로 큰 경우 명령줄에 node 또는 nodemon을 직접 입력하여 코드를 실행해도 얻은 데이터가 콘솔에 완전히 표시되지 않습니다. 따라서 요청 데이터를 인쇄하려는 위치에 중단점을 배치하고 디버거 모드를 통해 코드를 실행할 수 있습니다. 🎜🎜


'data'
이벤트는 최대 64kb까지 읽을 수 있습니다. a time 그림이 비교적 큰 경우 데이터가 여러 번 트리거될 수 있으므로 요청에 의해 전송된 데이터를 저장하기 위해 reqData
변수를 정의합니다. 🎜rrreee🎜req</code > <code >'end'
트리거 이벤트 설명은 요청한 데이터를 읽었다는 것입니다. 위 코드 console.log(reqData)
의 6번째 줄에 중단점을 설정하면, 그런 다음 reqData
를 보면 얻은 데이터는 다음과 같습니다: 🎜🎜
image/pngrnrn
및 rn----------이어야 합니다. ----------- -------158329774739626517859573--rn
중간 단락입니다. 이미지 데이터의 시작(imgDataStartIndex
)과 끝(imgDataEndIndex
) 위치의 인덱스를 가져온 다음 substring()
을 사용하여 가로채고 마지막으로 trim()
메서드를 사용하여 선행 공백 rn
을 제거합니다. 🎜rrreee🎜Get 구분자 경계🎜
🎜-------------158329774739626517859573
는 클라이언트에 의해 무작위로 생성되어 사용됩니다. 양식의 각 단락을 분할하려면 각 양식 항목의 시작과 끝 부분에 데이터 구분 기호(경계)가 있으며 시작 앞과 끝 부분에 두 개의 빼기 기호 --
가 추가됩니다. 전체 양식 데이터의 끝에는 두 개의 빼기 기호도 있습니다. 요청 헤더 보기: 🎜🎜
content-type
에 경계
가 정의되어 있음을 확인할 수 있으므로 다음 방법을 사용하여 구분자를 가져올 수 있습니다: 🎜rrreee🎜🎜이미지 생성🎜🎜🎜이미지 데이터 imgData
를 얻은 후 fs의 writeFile()
은 파일을 작성하여 이미지를 생성합니다. 🎜rrreee 🎜인코딩
을 설정하려면 'binary'
의 세 번째 Pass 매개변수에 있어야 합니다. 🎜🎜🎜Summary🎜🎜🎜이제 코드는 다음과 같이 요약됩니다.🎜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 教程!
위 내용은 Node의 http 모듈이 파일 업로드를 처리하는 방법에 대한 간략한 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











파일 업로드를 처리하는 방법은 무엇입니까? 다음 글에서는 Express를 사용하여 노드 프로젝트에서 파일 업로드를 처리하는 방법을 소개하겠습니다. 도움이 되길 바랍니다.

nvm을 사용하여 노드를 삭제하는 방법: 1. "nvm-setup.zip"을 다운로드하여 C 드라이브에 설치합니다. 2. "nvm -v" 명령을 통해 환경 변수를 구성하고 버전 번호를 확인합니다. install" 명령 노드 설치; 4. "nvm uninstall" 명령을 통해 설치된 노드를 삭제합니다.

이 기간 동안 저는 Tencent 문서의 모든 카테고리에 공통되는 HTML 동적 서비스를 개발 중입니다. 다양한 카테고리에 대한 액세스 생성 및 배포를 촉진하고 클라우드로 이동하는 추세에 부응하기 위해. Docker를 사용하여 서비스 콘텐츠를 수정하고 제품 버전을 균일하게 관리합니다. 이 글에서는 제가 Docker를 서비스하면서 쌓은 최적화 경험을 여러분의 참고용으로 공유하겠습니다.

이 기사에서는 Node의 프로세스 관리 도구인 "pm2"를 공유하고 pm2가 필요한 이유, pm2 설치 및 사용 방법에 대해 설명합니다. 모두에게 도움이 되기를 바랍니다!

Pinetwork 노드에 대한 자세한 설명 및 설치 안내서이 기사에서는 Pinetwork Ecosystem을 자세히 소개합니다. Pi 노드, Pinetwork 생태계의 주요 역할을 수행하고 설치 및 구성을위한 전체 단계를 제공합니다. Pinetwork 블록 체인 테스트 네트워크가 출시 된 후, PI 노드는 다가오는 주요 네트워크 릴리스를 준비하여 테스트에 적극적으로 참여하는 많은 개척자들의 중요한 부분이되었습니다. 아직 Pinetwork를 모른다면 Picoin이 무엇인지 참조하십시오. 리스팅 가격은 얼마입니까? PI 사용, 광업 및 보안 분석. Pinetwork 란 무엇입니까? Pinetwork 프로젝트는 2019 년에 시작되었으며 독점적 인 Cryptocurrency Pi Coin을 소유하고 있습니다. 이 프로젝트는 모든 사람이 참여할 수있는 사람을 만드는 것을 목표로합니다.

nodejs 실행 파일을 pkg로 패키징하는 방법은 무엇입니까? 다음 기사에서는 pkg를 사용하여 Node 프로젝트를 실행 파일로 패키징하는 방법을 소개합니다. 도움이 되기를 바랍니다.

"node-gyp.js"와 "Node.js"의 버전이 일치하지 않아 npm node gyp가 실패했습니다. 해결 방법: 1. "npm 캐시 clean -f"를 통해 노드 캐시를 지웁니다. 2. "npm install - g n" n 모듈을 설치합니다. 3. "n v12.21.0" 명령을 통해 "node v12.21.0" 버전을 설치합니다.

인증은 모든 웹 애플리케이션에서 가장 중요한 부분 중 하나입니다. 이 튜토리얼에서는 토큰 기반 인증 시스템과 기존 로그인 시스템과의 차이점에 대해 설명합니다. 이 튜토리얼이 끝나면 Angular와 Node.js로 작성된 완벽하게 작동하는 데모를 볼 수 있습니다. 기존 인증 시스템 토큰 기반 인증 시스템으로 넘어가기 전에 기존 인증 시스템을 살펴보겠습니다. 사용자는 로그인 양식에 사용자 이름과 비밀번호를 입력하고 로그인을 클릭합니다. 요청한 후 데이터베이스를 쿼리하여 백엔드에서 사용자를 인증합니다. 요청이 유효하면 데이터베이스에서 얻은 사용자 정보를 이용하여 세션을 생성하고, 세션 정보를 응답 헤더에 반환하여 브라우저에 세션 ID를 저장한다. 다음과 같은 애플리케이션에 대한 액세스를 제공합니다.
