diff --git a/app/lib/image-helper.js b/app/lib/image-helper.js index e51d2e6..aac0cfe 100644 --- a/app/lib/image-helper.js +++ b/app/lib/image-helper.js @@ -1,6 +1,7 @@ module.exports = { createFromFile: createFromFile, createFromUrl: createFromUrl, + createFromData: createFromData, getFromPost: getFromPost, putModel: putModel, } @@ -46,6 +47,11 @@ function createFromFile (file, callback) { } function createFromUrl (url, callback) { + const scheme = (/^([a-z]+):/i.exec(url)||['']).pop().toLowerCase(); + + if (scheme === 'data') + return createFromData(url, callback); + const row = { slug: hashString(Date.now() + url), url: url @@ -56,6 +62,35 @@ function createFromUrl (url, callback) { }); } +function createFromData (data, callback) { + if (typeof data === 'string') { + const parts = /^(?:data:)?(?:([^;]+);)?(?:charset=(.*);)?(?:([^,]+),)?(.*)$/i.exec(data); + + data = { + mimetype: parts[1], + charset: parts[2], + encoding: parts[3], + data: parts[4] + }; + } + + const mimetype = data.mimetype || 'text/plain'; + const charset = data.charset || 'US-ASCII'; + const encoding = data.encoding || null; + + const buffer = new Buffer(data.data, encoding); + + const row = { + slug: hashString(Date.now() + data.data), + mimetype: mimetype, + data: buffer + }; + + Images.put(row, function (err, result) { + callback(err, result.insertId); + }); +} + function putModel(Model) { return function put(data, image, callback) { function finish(err, imageId) { @@ -79,7 +114,10 @@ function putModel(Model) { if (image) { if (typeof image === 'string') { - image = {url: image}; + if (/^data:/.test(image)) + image = {data: image}; + else + image = {url: image}; } else { image = { mimetype: image.type, @@ -91,7 +129,7 @@ function putModel(Model) { validationErrors = validationErrors.concat(Images.validateRow(image)); - if (!image.size && !image.url) { + if (!image.size && !image.url && !image.data) { validationErrors.push({ message: "Missing value", field: 'image' @@ -110,5 +148,8 @@ function putModel(Model) { if (image.url) return createFromUrl(image.url, finish); + + if (image.data) + return createFromData(image.data, finish); } }