작업에서 그러한 요구 사항이 발생했으며 파일을 업로드하기 위해 Nodejs를 사용해야했습니다. 나는 브라우저를 통해 파일을 업로드하는 방법 만 알고 있었다. nodejs를 사용하는 경우 브라우저의 동작을 시뮬레이션하는 것과 같습니다. Google 후 브라우저는 단순히 HTTP 프로토콜을 사용하여 데이터를 서버로 전송한다는 것을 깨달았습니다. 특정 프로토콜은 "RFC 1867- HTML의 양식 기반 파일 업로드"입니다. 브라우저에서 양식 양식을 통해 파일 업로드는이 프로토콜을 통해 이루어집니다. 브라우저가 서버로 보내는 데이터를 먼저 확인한 다음 사본에 따라 업로드 기능을 구현할 수 있습니다. 양식 양식에 파일을 업로드 할 때는 모두가 친숙해야합니다.
<form action = "http://www.qq.com/"method = "post"> <input type = "text"name = "text1" /> <br /> <입력 유형 = "text"name = "text2" /> <br /> <입력 유형 = "제출" /> < /form>
제출시 Fiddler를 사용하여 패킷을 캡처하여 다음 데이터가 서버로 전송되는 것을 알 수 있습니다.
게시물 http://www.qq.com/ http/1.1
호스트 : www.qq.com
컨텐츠 길이 : 23
컨텐츠 유형 : 응용 프로그램/x-www- 형태 방사화; charset = utf-8
Text1 = hello & text2 = World
컨텐츠 유형의 기본값은 Application/X-WWW-Form-urlencoded에 대한 기본값을 주목할 가치가 있으므로 메시지가 URL에 인코딩됩니다. 예를 들어, "Hello"는%E4%BD%A0%E5%A5%BD로 인코딩됩니다.
다음으로 양식이 업로드되는 방법을 살펴 보겠습니다. 누구나 친숙해야합니다.
<form action = "http://www.qq.com"method = "post"encticpe = "multipart/form-data"> <input type = "file"name = "myfile"/> <입력 유형 = "value ="제출 "/> </form>
그런 다음 Hello World라는 단어 만 사용하여 새 Upload.txt 텍스트 파일을 작성하여 업로드하십시오. 우리는 피들러를 사용하여 패키지를 잡습니다. 과거 데이터를 보내는 것이 조금 더 복잡하다는 것을 알 수 있습니다 (캐시 제어 및 쿠키와 같은 다른 관련없는 요청 라인이 제거되었습니다).
게시물 http://www.qq.com/ http/1.1
호스트 : www.qq.com
컨텐츠 길이 : 199
컨텐츠 유형 : 멀티 파트/형태-데이터; 경계 = --- WebKitFormBoundaryWr3X7SXBYQQ4ZF5G
----- WebKitFormBoundaryWr3X7SXBYQQ4ZF5G
내용화 : 형태 데이터; 이름 = "myfile"; filename = "upload.txt"
컨텐츠 유형 : 텍스트/일반
안녕하세요 세계
----- WebKitFormBoundaryWr3X7SXBYQQ4ZF5G--
RFC 1867의 정의에 따르면, 우리는 경계 데이터를 생성해야합니다. 이 데이터는 컨텐츠의 다른 곳에 나타날 수 없습니다. 이것은 스스로 정의 할 수 있습니다. 각 브라우저의 생성 알고리즘은 다를 수 있습니다. 위 경계는 데이터를 분리하는 것입니다. 분리 된 데이터를 생성 한 후, 분리 된 데이터는 헤드의 컨텐츠 유형에 배치되어 서버, 즉 위의 내용 유형 : 멀티 파트/양식 데이터; 경계 = --- webKitFormBoundaryWr3X7SXBYQQ4ZF5G, 업로드 된 컨텐츠는 별도의 데이터가있는 여러 세그먼트로 분리되어야하며 각 데이터 세그먼트에는 파일 이름과 업로드시 이름이 있습니다. 서버는이 이름을 사용하여 파일과 파일 유형 내용 유형을 수신합니다. 이 예에서는 텍스트/일반입니다. 업로드 된 PNG 이미지가 이미지/PNG 인 경우 이미지/PNG입니다. 파일 유형의 빈 줄 후에 업로드 된 파일의 내용도 이해하기 쉽습니다. 이 예에서 업로드 된 텍스트 파일은 컨텐츠를 직접 표시 할 수 있도록합니다. 업로드 된 이미지 파일이 바이너리 파일 인 경우 Fiddler는 garbled 코드를 표시합니다. 파일의 내용이 끝나면 빈 줄과 경계 데이터가 있습니다.
전송 형식의 세부 사항을 이해 한 후 다음 단계는 nodejs를 사용하여 프로그래밍하고 구현하는 것입니다. 간단히 말하면 형식에 따라 데이터를 서버로 보냅니다.
const http = require ( 'http'); const fs = require ( 'fs'); // 게시물 주소는 로컬 서비스의 PHP입니다. 업로드가 성공적인지 테스트하는 데 사용됩니다 var 옵션 = {localhost : 'port : 80, path :'post '} // generated data var varickey = '--- webKitFormBoundaryJlvkBqxtii0ygpab'; // 업로드 해야하는 파일 컨텐츠를 읽습니다 ( './ upload.txt', function (err, data) {// 분리 된 데이터 세그먼트 var payload = '-' + boundarykey + '/r/n' + '내용 설명 : form-data; name = "myfile"; filename = "upload.txt"/r/n + 'Content-Type : text/plain/r/n/r/n'; payload + = data; payload + = '/r/n-' + boundarykey + '-'; // 요청 보내기 var req = http.request (옵션, 함수 (res) {res.setencoding ( 'utf8'); res.on ( 'body. Chunk);});}); req.on ( 'error', function (e) {console.error ( "error :"+e);}); // 경계 쓰기, 보내야 할 데이터의 크기, 요청 req.setheader ( 'content-type', 'multiptar/form-data ('contentary-lenger+', req.setheade Kekey); buffer.bytelength (Payload, 'utf8')); req.write (payload); req.end ();});이 기사의 초점은 프로토콜을 이해하고 코드로 구현하는 것입니다. 코드 조직에는 여전히 많은 최적화가 있습니다.
마지막으로 로컬 아파치에서는 PHP를 작성하여 업로드 된 파일을 저장하여 테스트로 사용할 수 있습니다.
<? php $ filepath = './upload.txt'; move_uploaded_file($_files=``MyFile']], $ filepath); echo "ok";?>
또한 RFC 1867에 따르면 한 번에 여러 파일을 업로드하는 기능을 실현할 수 있습니다. 여기에는 자세히 설명되지 않습니다. 필요한 경우 자세한 구현은 RFC 1867을 참조하십시오.
위는 편집기가 소개 한 Node.js 파일 업로드입니다. 모든 사람에게 도움이되기를 바랍니다. 궁금한 점이 있으면 메시지를 남겨 주시면 편집자가 제 시간에 모든 사람에게 답장을 드리겠습니다. Wulin.com 웹 사이트를 지원해 주셔서 대단히 감사합니다!