Created
April 8, 2015 22:08
-
-
Save DanielDornhardt/0f3628c898b946a7cc4d to your computer and use it in GitHub Desktop.
Saving additional info to images using collectionFS on the server
This file contains 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
if Meteor.isServer | |
crypto = Npm.require 'crypto' | |
# find our "code" dir / the directory outside of meteor | |
pathArr = process.env.PWD.split '/' | |
pathArr.pop() | |
filesBasePath = pathArr.join '/' | |
filesBasePath = filesBasePath + '/uploads/example/' | |
fsOptionsOriginalSizeJpg = | |
path: filesBasePath + 'original/' | |
beforeWrite: (fileObj) -> | |
# We return an object which will change the filename extension and type for this store only | |
return { | |
extension: 'jpg' | |
type: 'image/jpg' | |
} | |
transformWrite: (fileObj, readStream, writeStream) -> | |
# we also want to keep a hash of the original image | |
hash = crypto.createHash 'sha1' | |
hash.setEncoding 'hex' | |
readStream.pipe hash | |
readStream.once 'end', Meteor.bindEnvironment -> | |
sha1 = hash.read() | |
fileObj.update {$set: {originalImageSha1: sha1}} | |
writeStream.once 'stored', Meteor.bindEnvironment -> | |
updateImageSizeInStore(fileObj, 'example_originalImages') | |
# if we already have a jpeg, don't recompress it | |
if fileObj.original?.type? == 'image/jpeg' | |
readStream.pipe writeStream | |
return | |
# convert to .jpg if it's not already | |
gm(readStream, fileObj.name()).quality('90').stream('JPEG').pipe(writeStream) | |
fsOptionsThumbnail = | |
path: filesBasePath + 'thumbs/', | |
beforeWrite: (fileObj) -> | |
# We return an object which will change the filename extension and type for this store only | |
return { | |
extension: 'jpg' | |
type: 'image/jpg' | |
} | |
transformWrite: (fileObj, readStream, writeStream) -> | |
# Transform the images into the 552x411 thumbnail format | |
gm(readStream, fileObj.name()).resize('552', '411').quality('90').stream('JPEG').pipe(writeStream) | |
writeStream.once 'stored', Meteor.bindEnvironment -> | |
updateImageSizeInStore(fileObj, 'example_thumbnailImages') | |
# initialize collection | |
@Images = new FS.Collection "example_images", | |
stores: [ | |
# putting header images on top because these are the first ones we want to show after uploading | |
new FS.Store.FileSystem "example_thumbnailImages", fsOptionsThumbnail | |
new FS.Store.FileSystem "example_originalImages", fsOptionsOriginalSizeJpg | |
] | |
filter: | |
maxSize: 20 * 1024 * 1024 # 20 megabytes, in bytes | |
allow: | |
contentTypes: ['image/*'] # allow only images in this FS.Collection | |
# Utility function to save the dimensions of images after converting them using gm | |
updateImageSizeInStore = (fileObj, storename) -> | |
readStream = fileObj.createReadStream storename | |
gm(readStream, fileObj.name({store: storename})).size Meteor.bindEnvironment (err, size) -> | |
#if err | |
# throw new Meteor.Error "Error reading filesize when trying to save filesize to db", err | |
updateOptions = {$set: {}} | |
updateOptions.$set['imageSizes.' + storename] = size | |
fileObj.update updateOptions |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment