1+ const Koa = require ( 'koa' ) ;
2+ const views = require ( 'koa-views' ) ;
3+ const fs = require ( 'fs' ) ;
4+ let querystring = require ( 'querystring' ) ;
5+ let path = require ( 'path' ) ;
6+ let uuid = require ( 'uuid' ) ;
7+ const app = new Koa ( ) ;
8+ app . use ( async ( ctx , next ) => {
9+ if ( ctx . method == 'GET' ) {
10+ ctx . set ( 'Content-Type' , 'text/html;charset=utf8' ) ;
11+ ctx . body = (
12+ `
13+ <form id="userform" method="POST" enctype="multipa
14+ 用户名:<input type="text" name="username">
15+ 密码<input type="text" name="password">
16+ 头像<input type="file" name="avatar">
17+ <input type="submit">
18+ </form>
19+ `
20+ ) ;
21+ } else if ( ctx . method == 'POST' ) {
22+ let buffers = [ ] ;
23+ ctx . req . on ( 'data' , function ( data ) {
24+ buffers . push ( data ) ;
25+ } ) ;
26+ ctx . req . on ( 'end' , function ( ) {
27+ let result = Buffer . concat ( buffers ) ;
28+ let type = ctx . headers [ 'content-type' ] ;
29+ let matched = type . match ( / \b b o u n d a r y = ( .+ ) \b / ) ;
30+ if ( matched ) {
31+ let seperator = '--' + matched [ 1 ] ;
32+ let body = process ( seperator , result ) ;
33+ ctx . body = body ;
34+ } else {
35+ next ( ) ;
36+ }
37+ } ) ;
38+ ctx . body = 'hello' ;
39+ } else {
40+ next ( ) ;
41+ }
42+ } ) ;
43+ app . listen ( 3000 ) ;
44+ Buffer . prototype . split = Buffer . prototype . split || function ( sep )
45+ let len = Buffer . byteLength ( sep ) ;
46+ let parts = [ ] ;
47+ let offset = 0 ;
48+ let pos = - 1 ;
49+ while ( - 1 != ( pos = this . indexOf ( sep , offset ) ) ) {
50+ parts . push ( this . slice ( offset , pos ) ) ;
51+ offset = pos + len ;
52+ }
53+ parts . push ( this . slice ( offset ) ) ;
54+ return parts ;
55+ }
56+ function process ( seperator , result ) {
57+ let lines = result . split ( seperator ) ;
58+ lines = lines . slice ( 1 , - 1 ) ;
59+ let body = { } ;
60+ let files = [ ] ;
61+ lines . forEach ( function ( line ) {
62+ let [ desc , val ] = line . split ( '\r\n\r\n' ) ;
63+ desc = desc . toString ( ) ;
64+ val = val . slice ( 0 , - 2 ) ;
65+ if ( desc . includes ( 'filename' ) ) { //如果是文件的话
66+ let [ , line1 , line2 ] = desc . split ( '\r\n' ) ;
67+ let obj1 = querystring . parse ( line1 , '; ' ) ;
68+ let obj2 = querystring . parse ( line2 , '; ' ) ;
69+ let filepath = path . join ( __dirname , 'uploads' , uuid . v4
70+ fs . writeFileSync ( filepath , val ) ;
71+ files . push ( {
72+ ...obj1 , filepath
73+ } ) ;
74+ } else {
75+ let matched = desc . match ( / \b n a m e = ( .+ ) \b / ) ;
76+ if ( matched )
77+ body [ matched [ 1 ] ] = val . toString ( ) ;
78+ }
79+ } ) ;
80+ return { body, files } ;
81+ }
0 commit comments