On Tue, May 15, 2012 at 2:46 PM, Alan Hoffmeister <[email protected]
> 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 <[email protected]>:
> > 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 <[email protected]>
> 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 <[email protected]>:
> >>> 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 [email protected]
> >>> To unsubscribe from this group, send email to
> >>> [email protected]
> >>> 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 [email protected]
> >> To unsubscribe from this group, send email to
> >> [email protected]
> >> 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 [email protected]
> > To unsubscribe from this group, send email to
> > [email protected]
> > 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 [email protected]
> To unsubscribe from this group, send email to
> [email protected]
> 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 [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to