http://dropup.net/  seems to be a similar implementation. The code is
available on Github   https://github.com/daleharvey/dropup

On Wed, May 16, 2012 at 5:57 PM, Tim Caswell <t...@creationix.com> wrote:

>
>
> On Wed, May 16, 2012 at 6:14 AM, Alan Hoffmeister <
> alanhoffmeis...@gmail.com> wrote:
>
>> Tim that's  a very good idea!
>> But how can I share the hash and the dimensions between the view
>> helper and the resizing route?
>>
>
> Well that depends on the nature of your code.  Is it a framework like
> express, is it something else.  If you're running the entire site in a
> single process then a single variable in the outer closure would be global
> enough.  Just like I wrote in the example, my lookup tables are outside the
> helper and the http route handler.  As long as it's in a common place they
> can both see in their closures, they will have access.
>
>
>
>>
>> --
>> Att,
>> Alan Hoffmeister
>>
>>
>> 2012/5/15 Tim Caswell <t...@creationix.com>:
>> > btw, this code isn't perfect.  For example, there is no reason to use
>> the
>> > expensive md5 hash.  It's not like the browser is sending you path,
>> width,
>> > and height and you need to re-hash them.  Any random unique string
>> would be
>> > fine.  Also the key variable would sufficient as well.  Yes, the url
>> > contains the parameters, but they can't be modified to create a new
>> value.
>> >  Only existing keys would be served.
>> >
>> > The important part is to create some unique key to embed in the url so
>> that
>> > later when the request comes in, you have a way to map it to the
>> original
>> > resize command.  The caching and batching pattern is described
>> > here http://nodebits.org/distilled-patterns
>> >
>> >
>> > On Tue, May 15, 2012 at 3:47 PM, Tim Caswell <t...@creationix.com>
>> wrote:
>> >>
>> >>
>> >>
>> >> On Tue, May 15, 2012 at 2:46 PM, Alan Hoffmeister
>> >> <alanhoffmeis...@gmail.com> wrote:
>> >>>
>> >>> Hey guyz, of course I need to validate, I just don't want to expose
>> >>> the dimensions.
>> >>
>> >>
>> >> The thing is you have to expose the dimensions if the request coming
>> from
>> >> a browser includes the dimensions.
>> >>
>> >> If you want to emulate what php is doing, it's easy enough.  Basically
>> >> this would be a template helper that registers a new route when found.
>> >>
>> >> // load the createHash function from the crypto module
>> >> var createHash = require('crypto').createHash;
>> >>
>> >> // Keep a history of registered routes
>> >> var resizes = {};
>> >> // Store an index by hash for url routing
>> >> var hashes = {};
>> >> // Register a new resize command, export this as a template helper.
>> >> function resize(path, width, height) {
>> >>   var key = path + width + "x" + height; // convert args to a unique
>> >> string
>> >>   if (resizes[key]) return resizes[key].url; // Check cache to see if
>> it's
>> >> already registered
>> >>   var hash = createHash("md5").update(key).digest("hex"); // calculate
>> the
>> >> md5 hash of the key to hide the params
>> >>   var entry = {
>> >>     url: "/images/" + hash + ".png",
>> >>     path: path,
>> >>     width: width,
>> >>     height: height
>> >>   };
>> >>   // Store the object in the two tables.
>> >>   resizes[key] = entry;
>> >>   hashes[hash] = entry;
>> >>   // return the url.
>> >>   return entry.url;
>> >> }
>> >>
>> >>
>> >> Then later in your http request handler, add a route to handle these
>> >> requests.
>> >>
>> >> app.get("/images/:hash.png", function (req, res) {
>> >>   var entry = hashes[req.params.hash];
>> >>   if (!entry) return doErrorHandling();
>> >>   resizeImage(entry, function (err, resizedPath) {
>> >>     if (err) return doErrorHandling();
>> >>   });
>> >> });
>> >>
>> >> And here is some untested code that does caching and batching of the
>> async
>> >> resize requests
>> >>
>> >> function resizeImage(entry, callback) {
>> >>   // Check if it's been resized already
>> >>   if (entry.resizedPath) {
>> >>     return callback(null, entry.resizedPath);
>> >>   }
>> >>   // Check if there is already a pending resize operation on this
>> object
>> >>   if (entry.resizeQueue) {
>> >>     return entry.resizeQueue.push(callback);
>> >>   }
>> >>   entry.resizeQueue = [callback];
>> >>   doRealResize(entry.path, entry.width, entry.height, function (err,
>> >> resizedPath) {
>> >>     if (err) return callback(err);
>> >>     var callbacks = entry.resizeQueue;
>> >>     delete entry.resizeQueue;
>> >>     entry.resizedPath = resizedPath;
>> >>     callbacks.forEach(function (callback) {
>> >>       callback(null, resizedPath);
>> >>     });
>> >>   });
>> >> }
>> >>
>> >> function doRealResize(path, width, height, callback) {
>> >>   // Do actual resize and return the final filename's filepath
>> >> }
>> >>
>> >>> --
>> >>> Att,
>> >>> Alan Hoffmeister
>> >>>
>> >>>
>> >>> 2012/5/15 Duncan Gmail <duncananguswil...@gmail.com>:
>> >>> > You can POST the size as well as use GET.  On the numbers, just
>> >>> > validate the input - you should be doing this anyway for all
>> inputted data,
>> >>> > in all languages.
>> >>> >
>> >>> > - MRdNk
>> >>> >
>> >>> > On 15 May 2012, at 15:21, Alan Hoffmeister <
>> alanhoffmeis...@gmail.com>
>> >>> > wrote:
>> >>> >
>> >>> >> Marc, that would work, but I'm concerned about security... What if
>> >>> >> someone access the url /images/100000/100000/avatar.jpg ?
>> >>> >>
>> >>> >> --
>> >>> >> Att,
>> >>> >> Alan Hoffmeister
>> >>> >>
>> >>> >>
>> >>> >> 2012/5/15 Marc Deschamps <md.fle...@gmail.com>:
>> >>> >>> I've done something like this using express:
>> >>> >>>
>> >>> >>> app.get('/images/:width/:height/:filename', routes.images.resize);
>> >>> >>>
>> >>> >>> Work great, in html i can do:
>> >>> >>>
>> >>> >>> <img src="/images/70/70/avatar.jpg"/>
>> >>> >>>
>> >>> >>> --
>> >>> >>> Job Board: http://jobs.nodejs.org/
>> >>> >>> Posting guidelines:
>> >>> >>>
>> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
>> >>> >>> You received this message because you are subscribed to the Google
>> >>> >>> Groups "nodejs" group.
>> >>> >>> To post to this group, send email to nodejs@googlegroups.com
>> >>> >>> To unsubscribe from this group, send email to
>> >>> >>> nodejs+unsubscr...@googlegroups.com
>> >>> >>> For more options, visit this group at
>> >>> >>> http://groups.google.com/group/nodejs?hl=en?hl=en
>> >>> >>
>> >>> >> --
>> >>> >> Job Board: http://jobs.nodejs.org/
>> >>> >> Posting guidelines:
>> >>> >>
>> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
>> >>> >> You received this message because you are subscribed to the Google
>> >>> >> Groups "nodejs" group.
>> >>> >> To post to this group, send email to nodejs@googlegroups.com
>> >>> >> To unsubscribe from this group, send email to
>> >>> >> nodejs+unsubscr...@googlegroups.com
>> >>> >> For more options, visit this group at
>> >>> >> http://groups.google.com/group/nodejs?hl=en?hl=en
>> >>> >
>> >>> > --
>> >>> > Job Board: http://jobs.nodejs.org/
>> >>> > Posting guidelines:
>> >>> > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
>> >>> > You received this message because you are subscribed to the Google
>> >>> > Groups "nodejs" group.
>> >>> > To post to this group, send email to nodejs@googlegroups.com
>> >>> > To unsubscribe from this group, send email to
>> >>> > nodejs+unsubscr...@googlegroups.com
>> >>> > For more options, visit this group at
>> >>> > http://groups.google.com/group/nodejs?hl=en?hl=en
>> >>>
>> >>> --
>> >>> Job Board: http://jobs.nodejs.org/
>> >>> Posting guidelines:
>> >>> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
>> >>> You received this message because you are subscribed to the Google
>> >>> Groups "nodejs" group.
>> >>> To post to this group, send email to nodejs@googlegroups.com
>> >>> To unsubscribe from this group, send email to
>> >>> nodejs+unsubscr...@googlegroups.com
>> >>> For more options, visit this group at
>> >>> http://groups.google.com/group/nodejs?hl=en?hl=en
>> >>
>> >>
>> >
>> > --
>> > Job Board: http://jobs.nodejs.org/
>> > Posting guidelines:
>> > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
>> > You received this message because you are subscribed to the Google
>> > Groups "nodejs" group.
>> > To post to this group, send email to nodejs@googlegroups.com
>> > To unsubscribe from this group, send email to
>> > nodejs+unsubscr...@googlegroups.com
>> > For more options, visit this group at
>> > http://groups.google.com/group/nodejs?hl=en?hl=en
>>
>> --
>> Job Board: http://jobs.nodejs.org/
>> Posting guidelines:
>> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
>> You received this message because you are subscribed to the Google
>> Groups "nodejs" group.
>> To post to this group, send email to nodejs@googlegroups.com
>> To unsubscribe from this group, send email to
>> nodejs+unsubscr...@googlegroups.com
>> For more options, visit this group at
>> http://groups.google.com/group/nodejs?hl=en?hl=en
>>
>
>  --
> Job Board: http://jobs.nodejs.org/
> Posting guidelines:
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To post to this group, send email to nodejs@googlegroups.com
> To unsubscribe from this group, send email to
> nodejs+unsubscr...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/nodejs?hl=en?hl=en
>

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to