diff --git a/README.md b/README.md index b4a3d8c..80794f9 100644 --- a/README.md +++ b/README.md @@ -72,11 +72,13 @@ Now, having this two key values then you can implement it: var boundary = "----WebKitFormBoundaryDtbT5UpPj83kllfw"; var parts = multipart.Parse(body,boundary); - for(var i=0;i } + // In the event of multiple files with the same "name" attribute, a part will be an array of files. Such as during a multi file upload. + // If no filename is supplied it will be ignored, if no name is supplied it will be null } ``` diff --git a/multipart.js b/multipart.js index 1efecfe..61a0e69 100644 --- a/multipart.js +++ b/multipart.js @@ -11,7 +11,7 @@ var parts = multipart.Parse(body,boundary); // each part is: - // { filename: 'A.txt', type: 'text/plain', data: } + // [ 'userfile': { filename: 'A.txt', name:'userfile', type: 'text/plain', data: } ] author: Cristian Salazar (christiansalazarh@gmail.com) www.chileshift.cl Twitter: @AmazonAwsChile @@ -19,33 +19,58 @@ exports.Parse = function(multipartBodyBuffer,boundary){ var process = function(part){ // will transform this object: - // { header: 'Content-Disposition: form-data; name="uploads[]"; filename="A.txt"', - // info: 'Content-Type: text/plain', + // { headers: [ + // 'Content-Disposition: form-data; name="uploads[]"; filename="A.txt"', + // 'Content-Type: text/plain' + // ] // part: 'AAAABBBB' } - // into this one: - // { filename: 'A.txt', type: 'text/plain', data: } - var obj = function(str){ - var k = str.split('='); - var a = k[0].trim(); - var b = JSON.parse(k[1].trim()); - var o = {}; - Object.defineProperty( o , a , - { value: b, writable: true, enumerable: true, configurable: true }) - return o; + // into this one: ( Assumed the return value? ) + // { filename: 'A.txt', name: 'userfile', type: 'text/plain', data: } + let file = { + data: new Buffer(part.part), + name: null, + }; + + //Content-Disposition: form-data; name="uploads[]"; filename="A.txt" + // Process our headers + for (let header of part.headers) { + if (header == '') continue; + let ex = header.split(":"); + + switch (ex[0].toLowerCase()) { + case 'content-type': + file.type = ex[1].trim(); + break; + case 'content-id': + file.id = ex[1].trim(); + break; + case 'content-disposition': + ex.splice(0,1); // Remove the header field name. + for (let param of ex[0].split(" ")) { + // Trim the ; if its there. + if (param.substr(-1) == ";") { + param = param.substr(0,param.length-1); + } + let pex = param.split("="); + if (pex[0].toLowerCase() == "name") { + pex.splice(0,1); + file.name = pex.join("=").trim().replace(/"/g,''); + } else if (pex[0].toLowerCase() == "filename") { + pex.splice(0,1); + file.filename = pex.join("=").trim().replace(/"/g,''); + } + } + break; + } } - var header = part.header.split(';'); - var file = obj(header[2]); - var contentType = part.info.split(':')[1].trim(); - Object.defineProperty( file , 'type' , - { value: contentType, writable: true, enumerable: true, configurable: true }) - Object.defineProperty( file , 'data' , - { value: new Buffer(part.part), writable: true, enumerable: true, configurable: true }) + return file; } + var prev = null; var lastline=''; - var header = ''; - var info = ''; var state=0; var buffer=[]; + var headers = []; + var state=0; var buffer=[]; var allParts = []; for(i=0;i