Last active
September 18, 2021 18:42
-
-
Save MiguelCastillo/ee10faeb81eec5471ac1 to your computer and use it in GitHub Desktop.
Multipart parse
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| function multipart(parts, done) { | |
| this.boundary = multipart.generateBoundary(); | |
| this.parts = []; | |
| this.filecount; | |
| var readycount = Object.keys(parts).length; | |
| function updateReady() { | |
| readycount--; | |
| if (!readycount) { | |
| done(); | |
| } | |
| } | |
| for (var name in parts) { | |
| if (parts.hasOwnProperty(name)) { | |
| this.append(name, parts[name], updateReady); | |
| } | |
| } | |
| } | |
| multipart.prototype.append = function(name, value, done) { | |
| var part = new multipart.part(name); | |
| var filereader; | |
| this.parts.push(part); | |
| if (typeof(value) === "string") { | |
| part.setValue(value); | |
| return done(); | |
| } | |
| if (typeof(value.type) === "string") { | |
| if (!/^text/.test(value.type)) { | |
| part.setHeader("Content-Transfer-Encoding", "binary"); | |
| } | |
| part.setHeader("Content-Type", value.type); | |
| } | |
| if (typeof(value.name) === "string") { | |
| this.filecount++; | |
| part.setFilename(value.name); | |
| filereader = new FileReader(); | |
| filereader.onload = function(evt) { | |
| part.setValue(evt.target.result); | |
| return done(); | |
| }; | |
| filereader.readAsBinaryString(value); | |
| } | |
| return part; | |
| }; | |
| multipart.prototype.serialize = function() { | |
| var body = '', | |
| boundary = this.boundary, | |
| result = {}; | |
| this.parts.forEach(function(part) { | |
| body += '--' + boundry + "\r\n" + 'Content-Disposition: form-data; name="' + part.getName() + '";'; | |
| if (part.isFile()) { | |
| body += ' filename="' + part.getFilename() + '"'; | |
| } | |
| body += "\r\n"; | |
| for (var header in part.headers) { | |
| body += header + ": " + part.headers[header] + "\r\n"; | |
| } | |
| body += "\r\n" + part.getValue() + "\r\n"; | |
| }); | |
| result.body = body + '--' + result.boundry + '--'; | |
| result.length = result.body.length; | |
| result.type = 'multipart/form-data; boundary=' + boundry; | |
| return result; | |
| }; | |
| multipart.generateBoundary = function() { | |
| return "--------------" + Math.floor(Math.random()*1000000000); | |
| }; | |
| /** | |
| * Part object | |
| */ | |
| multipart.part = function(name) { | |
| this.name = name; | |
| this.headers = {}; | |
| }; | |
| multipart.part.prototype.getName = function() { | |
| return this.name; | |
| }; | |
| multipart.part.prototype.setValue = function(value) { | |
| this.value = value; | |
| }; | |
| multipart.part.prototype.getValue = function() { | |
| return this.value; | |
| }; | |
| multipart.part.prototype.setFilename = function(filename) { | |
| this.filename = filename; | |
| }; | |
| multipart.part.prototype.getFilename = function() { | |
| return this.filename; | |
| }; | |
| multipart.part.prototype.isFile = function() { | |
| return !!this.filename; | |
| }; | |
| multipart.part.prototype.setHeader = function(name, value) { | |
| this.headers[name] = value; | |
| }; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment