root / HServer / 00.Server / 00.Program / node_modules / dicer / README.md
이력 | 보기 | 이력해설 | 다운로드 (3.57 KB)
| 1 | 39 | HKM | |
|---|---|---|---|
| 2 | Description |
||
| 3 | =========== |
||
| 4 | |||
| 5 | A very fast streaming multipart parser for node.js. |
||
| 6 | |||
| 7 | Benchmarks can be found [here](https://github.com/mscdex/dicer/wiki/Benchmarks). |
||
| 8 | |||
| 9 | |||
| 10 | Requirements |
||
| 11 | ============ |
||
| 12 | |||
| 13 | * [node.js](http://nodejs.org/) -- v0.8.0 or newer |
||
| 14 | |||
| 15 | |||
| 16 | Install |
||
| 17 | ============ |
||
| 18 | |||
| 19 | npm install dicer |
||
| 20 | |||
| 21 | |||
| 22 | Examples |
||
| 23 | ======== |
||
| 24 | |||
| 25 | * Parse an HTTP form upload |
||
| 26 | |||
| 27 | ```javascript |
||
| 28 | var inspect = require('util').inspect,
|
||
| 29 | http = require('http');
|
||
| 30 | |||
| 31 | var Dicer = require('dicer');
|
||
| 32 | |||
| 33 | // quick and dirty way to parse multipart boundary |
||
| 34 | var RE_BOUNDARY = /^multipart\/.+?(?:; boundary=(?:(?:"(.+)")|(?:([^\s]+))))$/i, |
||
| 35 | HTML = new Buffer('<html><head></head><body>\
|
||
| 36 | <form method="POST" enctype="multipart/form-data">\ |
||
| 37 | <input type="text" name="textfield"><br />\ |
||
| 38 | <input type="file" name="filefield"><br />\ |
||
| 39 | <input type="submit">\ |
||
| 40 | </form>\ |
||
| 41 | </body></html>'), |
||
| 42 | PORT = 8080; |
||
| 43 | |||
| 44 | http.createServer(function(req, res) {
|
||
| 45 | var m; |
||
| 46 | if (req.method === 'POST' |
||
| 47 | && req.headers['content-type'] |
||
| 48 | && (m = RE_BOUNDARY.exec(req.headers['content-type']))) {
|
||
| 49 | var d = new Dicer({ boundary: m[1] || m[2] });
|
||
| 50 | |||
| 51 | d.on('part', function(p) {
|
||
| 52 | console.log('New part!');
|
||
| 53 | p.on('header', function(header) {
|
||
| 54 | for (var h in header) {
|
||
| 55 | console.log('Part header: k: ' + inspect(h)
|
||
| 56 | + ', v: ' + inspect(header[h])); |
||
| 57 | } |
||
| 58 | }); |
||
| 59 | p.on('data', function(data) {
|
||
| 60 | console.log('Part data: ' + inspect(data.toString()));
|
||
| 61 | }); |
||
| 62 | p.on('end', function() {
|
||
| 63 | console.log('End of part\n');
|
||
| 64 | }); |
||
| 65 | }); |
||
| 66 | d.on('finish', function() {
|
||
| 67 | console.log('End of parts');
|
||
| 68 | res.writeHead(200); |
||
| 69 | res.end('Form submission successful!');
|
||
| 70 | }); |
||
| 71 | req.pipe(d); |
||
| 72 | } else if (req.method === 'GET' && req.url === '/') {
|
||
| 73 | res.writeHead(200); |
||
| 74 | res.end(HTML); |
||
| 75 | } else {
|
||
| 76 | res.writeHead(404); |
||
| 77 | res.end(); |
||
| 78 | } |
||
| 79 | }).listen(PORT, function() {
|
||
| 80 | console.log('Listening for requests on port ' + PORT);
|
||
| 81 | }); |
||
| 82 | ``` |
||
| 83 | |||
| 84 | |||
| 85 | API |
||
| 86 | === |
||
| 87 | |||
| 88 | _Dicer_ is a _WritableStream_ |
||
| 89 | |||
| 90 | Dicer (special) events |
||
| 91 | ---------------------- |
||
| 92 | |||
| 93 | * **finish**() - Emitted when all parts have been parsed and the Dicer instance has been ended. |
||
| 94 | |||
| 95 | * **part**(< _PartStream_ >stream) - Emitted when a new part has been found. |
||
| 96 | |||
| 97 | * **preamble**(< _PartStream_ >stream) - Emitted for preamble if you should happen to need it (can usually be ignored). |
||
| 98 | |||
| 99 | * **trailer**(< _Buffer_ >data) - Emitted when trailing data was found after the terminating boundary (as with the preamble, this can usually be ignored too). |
||
| 100 | |||
| 101 | |||
| 102 | Dicer methods |
||
| 103 | ------------- |
||
| 104 | |||
| 105 | * **(constructor)**(< _object_ >config) - Creates and returns a new Dicer instance with the following valid `config` settings: |
||
| 106 | |||
| 107 | * **boundary** - _string_ - This is the boundary used to detect the beginning of a new part. |
||
| 108 | |||
| 109 | * **headerFirst** - _boolean_ - If true, preamble header parsing will be performed first. |
||
| 110 | |||
| 111 | * **maxHeaderPairs** - _integer_ - The maximum number of header key=>value pairs to parse **Default:** 2000 (same as node's http). |
||
| 112 | |||
| 113 | * **setBoundary**(< _string_ >boundary) - _(void)_ - Sets the boundary to use for parsing and performs some initialization needed for parsing. You should only need to use this if you set `headerFirst` to true in the constructor and are parsing the boundary from the preamble header. |
||
| 114 | |||
| 115 | |||
| 116 | |||
| 117 | _PartStream_ is a _ReadableStream_ |
||
| 118 | |||
| 119 | PartStream (special) events |
||
| 120 | --------------------------- |
||
| 121 | |||
| 122 | * **header**(< _object_ >header) - An object containing the header for this particular part. Each property value is an _array_ of one or more string values. |