From e028efc85bad2176d317f0c2fd45f0618691ffee Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Thu, 7 Aug 2014 23:02:00 +0200 Subject: [PATCH 01/11] Added support for dataURLs to galleryService --- lib/gallery/galleryrepositoryService.js | 21 +++++++++++++++++++++ package.json | 4 +++- test/gallery/galleryrepository_test.js | 12 ++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/gallery/galleryrepositoryService.js b/lib/gallery/galleryrepositoryService.js index b0b62980e..3cf42b4bc 100644 --- a/lib/gallery/galleryrepositoryService.js +++ b/lib/gallery/galleryrepositoryService.js @@ -5,6 +5,9 @@ var logger = require('winston').loggers.get('gallery'); var magick = require('imagemagick'); var uuid = require('node-uuid'); var path = require('path'); +var fs = require('fs'); +var tmp = require('tmp'); +var dataurl = require('dataurl'); function autoOrient(sourceImagePath, targetPath, callback) { if (logger.debug) { @@ -75,6 +78,24 @@ module.exports = { }); }, + storeImageFromDataURL: function storeImageFromDataURL(dataURL, callback) { + var _this = this; + + var dataPackage = dataurl.parse(dataURL); + if (!dataPackage || !dataPackage.mimetype.match(/image\/(jpg|jpeg)/)) { + return callback(new Error('Not a valid dataURL')); + } + // Write to tmpFile + tmp.file({postfix: '.jpg'}, function (err, path, fd) { + fs.writeFile(path, dataPackage.data, {encoding: dataPackage.encoding}, function (err) { + if (err) { + return callback(err); + } + _this.storeImage(path, callback); + }); + }); + }, + getMetadataForImage: function getMetadataForImage(id, callback) { var persistentImageFilePath = this.directory() + '/' + id; magick.readMetadata(persistentImageFilePath, callback); diff --git a/package.json b/package.json index 150ede636..912807a39 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "cookie-parser": "1.3.2", "CoolBeans": "0.0.9", "csurf": "1.4.0", + "dataurl": "^0.1.0", "express": "4.7.2", "express-session": "1.7.2", "i18next": "1.7.4", @@ -64,11 +65,12 @@ "soap-sympa": "0.0.1", "static-favicon": "1.0.2", "stripe": "2.8.0", + "tmp": "0.0.24" "underscore.string": "2.3.3", "URIjs": "1.13.2", "useragent": "2.0.9", "winston": "0.7.3", - "winston-config": "0.4.2" + "winston-config": "0.4.2", }, "devDependencies": { "grunt": "0.4.5", diff --git a/test/gallery/galleryrepository_test.js b/test/gallery/galleryrepository_test.js index bf6901ff0..de6653f33 100644 --- a/test/gallery/galleryrepository_test.js +++ b/test/gallery/galleryrepository_test.js @@ -48,6 +48,18 @@ describe("the gallery repository on real files", function () { }); }); + it('stores a dataurl image', function (done) { + var dataURL = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCADIAMgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8qqKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/2Q=='; + service.storeImageFromDataURL(dataURL, function (err, imageId) { + service.retrieveImage(imageId, function (err) { + if (err) { + done(err); + } + done(); + }); + }); + }); + it('provides exif data for a given image', function (done) { var storedImageId = 'exif_image.jpg'; var imagePath = __dirname + '/fixtures/' + storedImageId; From 82ec856d265bab3a7c8c944341e4d44a6cef3984 Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Thu, 7 Aug 2014 23:06:50 +0200 Subject: [PATCH 02/11] Removed fs require --- lib/gallery/galleryrepositoryService.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/gallery/galleryrepositoryService.js b/lib/gallery/galleryrepositoryService.js index 3cf42b4bc..8f383d271 100644 --- a/lib/gallery/galleryrepositoryService.js +++ b/lib/gallery/galleryrepositoryService.js @@ -5,7 +5,6 @@ var logger = require('winston').loggers.get('gallery'); var magick = require('imagemagick'); var uuid = require('node-uuid'); var path = require('path'); -var fs = require('fs'); var tmp = require('tmp'); var dataurl = require('dataurl'); @@ -87,7 +86,7 @@ module.exports = { } // Write to tmpFile tmp.file({postfix: '.jpg'}, function (err, path, fd) { - fs.writeFile(path, dataPackage.data, {encoding: dataPackage.encoding}, function (err) { + _this.fs().writeFile(path, dataPackage.data, {encoding: dataPackage.encoding}, function (err) { if (err) { return callback(err); } From d5d8b34999bc3799f9cee06487213145b006c8e4 Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Thu, 7 Aug 2014 23:20:45 +0200 Subject: [PATCH 03/11] Fixed package.json --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 912807a39..5430a9afc 100644 --- a/package.json +++ b/package.json @@ -65,12 +65,12 @@ "soap-sympa": "0.0.1", "static-favicon": "1.0.2", "stripe": "2.8.0", - "tmp": "0.0.24" + "tmp": "0.0.24", "underscore.string": "2.3.3", "URIjs": "1.13.2", "useragent": "2.0.9", "winston": "0.7.3", - "winston-config": "0.4.2", + "winston-config": "0.4.2" }, "devDependencies": { "grunt": "0.4.5", From 0e637953e242b8493772b4b3ae48a478bc5b95ce Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Thu, 7 Aug 2014 23:20:59 +0200 Subject: [PATCH 04/11] Added handling of dataURL to activityResult Upload Route --- lib/activityresults/index.js | 70 +++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 28 deletions(-) diff --git a/lib/activityresults/index.js b/lib/activityresults/index.js index f3b1d8f29..4eb6a1d98 100644 --- a/lib/activityresults/index.js +++ b/lib/activityresults/index.js @@ -58,41 +58,55 @@ app.post('/', function (req, res) { }); }); -app.post("/:activityResultName/upload", function (req, res) { - new Form().parse(req, function (err, fields, files) { - if (!files) { - return res.send(400); +var processUploadRequestWithImageUri = function (imageUri, req, res) { + galleryRepository.getMetadataForImage(imageUri, function (err, metadata) { + var date; + if (metadata && metadata.exif) { + date = metadata.exif.dateTime || + metadata.exif.dateTimeOriginal || + metadata.exif.dateTimeDigitized || + new Date(); + } else { + date = new Date(); } - var image = files.image[0]; - galleryRepository.storeImage(image.path, function (err, imageUri) { + + var newPhoto = { + id: uuid.v4(), + uri: galleryApp.path() + imageUri, + timestamp: date, + uploaded_by: req.user.member.state.id + }; + + activityresultsService.addPhotoToActivityResult(req.params.activityResultName, newPhoto, function (err) { + res.location(app.path() + req.params.activityResultName + '/photo/' + newPhoto.id + '/edit'); + res.send(303); + }); + }); +}; + +app.post("/:activityResultName/upload", function (req, res) { + if (req.body.photo) { + // DataURL + galleryRepository.storeImageFromDataURL(req.body.photo, function (err, imageUri) { if (err) { throw err; } - galleryRepository.getMetadataForImage(imageUri, function (err, metadata) { - var date; - if (metadata && metadata.exif) { - date = metadata.exif.dateTime || - metadata.exif.dateTimeOriginal || - metadata.exif.dateTimeDigitized || - new Date(); - } else { - date = new Date(); + this.processUploadRequestWithImageUri(imageUri, req, res); + }); + } else { + new Form().parse(req, function (err, fields, files) { + if (!files) { + return res.send(400); + } + var image = files.image[0]; + galleryRepository.storeImage(image.path, function (err, imageUri) { + if (err) { + throw err; } - - var newPhoto = { - id: uuid.v4(), - uri: galleryApp.path() + imageUri, - timestamp: date, - uploaded_by: req.user.member.state.id - }; - - activityresultsService.addPhotoToActivityResult(req.params.activityResultName, newPhoto, function (err) { - res.location(app.path() + req.params.activityResultName + '/photo/' + newPhoto.id + '/edit'); - res.send(303); - }); + this.processUploadRequestWithImageUri(imageUri, req, res); }); }); - }); + } }); app.get("/:activityResultName/photo/:photoId/edit", function (req, res) { From f302e9ef064d9ddb4dc75e44829b5066bee025c6 Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Thu, 7 Aug 2014 23:40:16 +0200 Subject: [PATCH 05/11] Added test for dataURL upload --- .../activityresults_integration_upload_test.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/activityresults/activityresults_integration_upload_test.js b/test/activityresults/activityresults_integration_upload_test.js index d6e2db550..b761dda48 100644 --- a/test/activityresults/activityresults_integration_upload_test.js +++ b/test/activityresults/activityresults_integration_upload_test.js @@ -45,4 +45,21 @@ describe('/activityresults/:result/upload', function () { .end(done); }); }); + + describe('POST / with dataURL', function () { + it("should store the image via gallery service and redirect to edit", function (done) { + var dataURL = 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAMCAgICAgMCAgIDAwMDBAYEBAQEBAgGBgUGCQgKCgkICQkKDA8MCgsOCwkJDRENDg8QEBEQCgwSExIQEw8QEBD/2wBDAQMDAwQDBAgEBAgQCwkLEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBD/wAARCADIAMgDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD8qqKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAP/2Q=='; + sinon.stub(galleryRepository, 'storeImage', function (tmpFile, callback) { + callback(null, "my-custom-image-id"); + }); + + //noinspection JSLint + request(createApp(1)) + .post('/foo/upload') + .send({photo: dataURL}) + .expect(303) + .expect('Location', /\/foo\/photo\/[\w+|\-]+\/edit/) + .end(done); + }); + }); }); From ee18f82ffacf62dad3e7f927fd13af36f65021c7 Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Thu, 7 Aug 2014 23:55:05 +0200 Subject: [PATCH 06/11] Use body-parser for POST route --- lib/activityresults/index.js | 7 ++++--- .../activityresults_integration_upload_test.js | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/activityresults/index.js b/lib/activityresults/index.js index 4eb6a1d98..c0fc9b1a1 100644 --- a/lib/activityresults/index.js +++ b/lib/activityresults/index.js @@ -1,5 +1,6 @@ 'use strict'; var beans = require('nconf').get('beans'); +var bodyParser = require("body-parser"); var ActivityResult = beans.get('activityresult'); var activityresultsPersistence = beans.get('activityresultsPersistence'); var activityresultsService = beans.get('activityresultsService'); @@ -84,14 +85,14 @@ var processUploadRequestWithImageUri = function (imageUri, req, res) { }); }; -app.post("/:activityResultName/upload", function (req, res) { +app.post("/:activityResultName/upload", bodyParser(), function (req, res) { if (req.body.photo) { // DataURL galleryRepository.storeImageFromDataURL(req.body.photo, function (err, imageUri) { if (err) { throw err; } - this.processUploadRequestWithImageUri(imageUri, req, res); + processUploadRequestWithImageUri(imageUri, req, res); }); } else { new Form().parse(req, function (err, fields, files) { @@ -103,7 +104,7 @@ app.post("/:activityResultName/upload", function (req, res) { if (err) { throw err; } - this.processUploadRequestWithImageUri(imageUri, req, res); + processUploadRequestWithImageUri(imageUri, req, res); }); }); } diff --git a/test/activityresults/activityresults_integration_upload_test.js b/test/activityresults/activityresults_integration_upload_test.js index b761dda48..a134bd1fd 100644 --- a/test/activityresults/activityresults_integration_upload_test.js +++ b/test/activityresults/activityresults_integration_upload_test.js @@ -56,7 +56,7 @@ describe('/activityresults/:result/upload', function () { //noinspection JSLint request(createApp(1)) .post('/foo/upload') - .send({photo: dataURL}) + .send({photo: dataURL, "hallo": "welt"}) .expect(303) .expect('Location', /\/foo\/photo\/[\w+|\-]+\/edit/) .end(done); From 9c8336e5e986e8ebec9469525c4cc1c5ade62e44 Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Thu, 7 Aug 2014 23:55:24 +0200 Subject: [PATCH 07/11] Remove useless POST variable --- test/activityresults/activityresults_integration_upload_test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/activityresults/activityresults_integration_upload_test.js b/test/activityresults/activityresults_integration_upload_test.js index a134bd1fd..b761dda48 100644 --- a/test/activityresults/activityresults_integration_upload_test.js +++ b/test/activityresults/activityresults_integration_upload_test.js @@ -56,7 +56,7 @@ describe('/activityresults/:result/upload', function () { //noinspection JSLint request(createApp(1)) .post('/foo/upload') - .send({photo: dataURL, "hallo": "welt"}) + .send({photo: dataURL}) .expect(303) .expect('Location', /\/foo\/photo\/[\w+|\-]+\/edit/) .end(done); From c9dee5df0f5ae11c48ea577ddf4805a86145918c Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Fri, 8 Aug 2014 01:02:36 +0200 Subject: [PATCH 08/11] Increase body size to a few megs --- app.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.js b/app.js index d64441046..37c6e62a4 100644 --- a/app.js +++ b/app.js @@ -62,7 +62,7 @@ module.exports = { app.use(favicon(path.join(__dirname, 'public/img/Softwerkskammer16x16.ico'))); app.use(morgan('combined', {stream: winstonStream})); app.use(cookieParser()); - app.use(bodyparser.urlencoded({extended: true})); + app.use(bodyparser.urlencoded({extended: true, limit: '50mb'})); app.use(compress()); app.use(serveStatic(path.join(__dirname, 'public'), { maxAge: 600 * 1000 })); // ten minutes From 58ff31af7ac58fe5381befa2cc54506d02918209 Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Fri, 8 Aug 2014 01:03:20 +0200 Subject: [PATCH 09/11] Add JS submit for uploading resized images --- lib/activityresults/index.js | 5 ++- lib/activityresults/views/get.jade | 60 ++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/lib/activityresults/index.js b/lib/activityresults/index.js index c0fc9b1a1..fb2699cd3 100644 --- a/lib/activityresults/index.js +++ b/lib/activityresults/index.js @@ -79,13 +79,16 @@ var processUploadRequestWithImageUri = function (imageUri, req, res) { }; activityresultsService.addPhotoToActivityResult(req.params.activityResultName, newPhoto, function (err) { + if (req.header('X-Requested-With') === 'XMLHttpRequest') { + return res.send(200, app.path() + req.params.activityResultName + '/photo/' + newPhoto.id + '/edit'); + } res.location(app.path() + req.params.activityResultName + '/photo/' + newPhoto.id + '/edit'); res.send(303); }); }); }; -app.post("/:activityResultName/upload", bodyParser(), function (req, res) { +app.post("/:activityResultName/upload", bodyParser({limit: '50mb'}), function (req, res) { if (req.body.photo) { // DataURL galleryRepository.storeImageFromDataURL(req.body.photo, function (err, imageUri) { diff --git a/lib/activityresults/views/get.jade b/lib/activityresults/views/get.jade index 947b6f1d9..fb1a725d6 100644 --- a/lib/activityresults/views/get.jade +++ b/lib/activityresults/views/get.jade @@ -96,6 +96,66 @@ block content span.small(style="color: black") +thumbnailInfos(img) + script(type='text/javascript'). + function resizeImageFromFile(file, MAX_WIDTH, MAX_HEIGHT, callback) { + // Load via FileReader + var fr = new FileReader(); + fr.onload = function(e) { + getDimensions(e.target.result, function(width, height, img) { + var newWidth = width; + var newHeight = height; + var aspectRatio = width/height; + // Image is wider than tall + if(width > MAX_WIDTH && aspectRatio >= 1) { + newWidth = MAX_WIDTH; + newHeight = MAX_WIDTH / aspectRatio + } else if(height > MAX_HEIGHT && aspectRatio <= 1) { + newWidth = MAX_HEIGHT * aspectRatio; + newHeight = MAX_HEIGHT; + } + resizeImage(img, newWidth, newHeight, function (canvas) { + callback(canvas.toDataURL('image/jpeg', 0.8)); + }) + }); + } + fr.readAsDataURL(file); + function resizeImage(imgElement, width, height, callback) { + var cvs = document.createElement("canvas"); + cvs.width = width; + cvs.height = height; + var ctx = cvs.getContext('2d'); + ctx.drawImage(imgElement, 0, 0, width, height); + callback(cvs); + } + function getDimensions(imgData, callback) { + var tmpImg = document.createElement("img"); + tmpImg.onload = function () { + callback(tmpImg.width, tmpImg.height, tmpImg); + } + tmpImg.src = imgData; + } + } + + $(function() { + var $recordForm = $('#recordForm'); + $recordForm.on('submit', function (e) { + var files = $('#input-file')[0].files; + if(!files || !files[0]) { + return; + } + resizeImageFromFile(files[0], 2560, 2560, function (dataURL) { + $.post($recordForm.attr('action'), { + photo: dataURL + }).success(function (data) { + window.location.href = data; + }).error(function (error) { + alert(error); + }); + }) + e.preventDefault(); + }); + }); + script(type='text/javascript'). var ESC_KEY = 27; jQuery(function() { From 1221c6d9d0e36e326748c4d296492ce42382184f Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Fri, 8 Aug 2014 01:22:21 +0200 Subject: [PATCH 10/11] Decrease quality of thumbnails --- lib/gallery/galleryrepositoryService.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/gallery/galleryrepositoryService.js b/lib/gallery/galleryrepositoryService.js index 8f383d271..1761b83bc 100644 --- a/lib/gallery/galleryrepositoryService.js +++ b/lib/gallery/galleryrepositoryService.js @@ -27,7 +27,7 @@ function scale(sourceImagePath, targetPath, width, height, fn) { if (logger.debug) { logger.debug('Scaling `' + sourceImagePath + '\' to ' + width + 'x' + height + ' into `' + targetPath + '\''); } - magick.convert([sourceImagePath, '-scale', width + '!x' + height + '!', targetPath], function (err, stdout) { + magick.convert([sourceImagePath, '-quality', '75', '-scale', width + '!x' + height + '!', targetPath], function (err, stdout) { if (err) { return fn(err, undefined); } @@ -42,7 +42,7 @@ function scaleWidth(sourceImagePath, targetPath, width, fn) { if (logger.debug) { logger.debug('Scaling `' + sourceImagePath + '\' to ' + width + 'x undefined into `' + targetPath + '\''); } - magick.convert([sourceImagePath, '-scale', width, targetPath], function (err, stdout) { + magick.convert([sourceImagePath, '-quality', '75', '-scale', width, targetPath], function (err, stdout) { if (err) { return fn(err, undefined); } From 50b1b21ec72b312135fce29680ba08b89b91b949 Mon Sep 17 00:00:00 2001 From: Raimo Radczewski Date: Fri, 8 Aug 2014 08:07:04 +0200 Subject: [PATCH 11/11] Added option to disable client side resizing --- lib/activityresults/views/get.jade | 8 +++++++- locales/translation-de.json | 3 ++- locales/translation-en.json | 3 ++- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/activityresults/views/get.jade b/lib/activityresults/views/get.jade index fb1a725d6..d35a06d97 100644 --- a/lib/activityresults/views/get.jade +++ b/lib/activityresults/views/get.jade @@ -46,9 +46,11 @@ block content div button(type="submit").btn.btn-success.pull-right= t('activityresults.submit') span#btn-cancel.btn.btn-warning= t('activityresults.cancel') + input#resizeOnClient(type='checkbox',name='resizeOnClient',checked='checked') + label(for='resizeOnClient')= t('activityresults.resize_on_client') - script. + script. function getPreview(files, callback) { if(!files || !files[0]) return null; @@ -139,6 +141,10 @@ block content $(function() { var $recordForm = $('#recordForm'); $recordForm.on('submit', function (e) { + if (!$('#resizeOnClient').is(':checked')) { + console.log('Not resizing image on client'); + return; + } var files = $('#input-file')[0].files; if(!files || !files[0]) { return; diff --git a/locales/translation-de.json b/locales/translation-de.json index 338beb34d..8e256402f 100644 --- a/locales/translation-de.json +++ b/locales/translation-de.json @@ -175,7 +175,8 @@ "done": "Fertig", "record_image": "Aufzeichnen", "submit": "Weiter", - "photoTitlePlaceholder": "Was kann man hier sehen?" + "photoTitlePlaceholder": "Was kann man hier sehen?", + "resize_on_client": "Bild auf Gerät skalieren" }, "payment": { "title": "Zahlung", diff --git a/locales/translation-en.json b/locales/translation-en.json index 2f1ab843c..6043b7b0b 100644 --- a/locales/translation-en.json +++ b/locales/translation-en.json @@ -174,7 +174,8 @@ "done": "Done", "photoTitlePlaceholder": "What's on this photo?", "record_image": "Record", - "submit": "SUBMIT" + "submit": "SUBMIT", + "resize_on_client": "Resize image on client" }, "payment": { "title": "Payment",