ColdFusion 10 File Uploads and MIME Types

Quick Note: On one project that I'm on, we're in the process of moving from ColdFusion 9 to 10. During some regression testing, one of the testers began receiving errors on file uploads. When looking at the code, I saw this:

view plain print about
1fileUploadResult = fileUpload(arguments.tierCSSDirectory, "header_background_image", "image/*", "overwrite");

Now, I remembered that there were changes to MIME type checking in CF 10, but I wasn't entirely sure. This code, written by one of our developer's several months ago, would allow any "image" MIME type. What we discovered is that we couldn't do this kind of wildcard mapping under CF 10, that we now had to list out each accepted MIME type as a comma delimited list.

Just thought I'd share.

ColdFusion Position - Denver, Colorado - Zen Planner

Ben Pate, of Zen Planner, contacted me yesterday about a new position they have, in their office in Denver, Colorado. A quick look shows a fun company to work for, with a great list of benefits. Check out their job posting and, if you're interested, drop Ben an email.

2012 In Review, and the View for 2013

2012 was....unexpected. January really kicked it off when my immediate supervisor left, to take a position with another company. When this happened my employer approached me about taking on his position. Now, I had left a management position to come to this company, so that I could again focus on writing code, so this meant stepping back into a management role. This is also the third time this particular scenario has played out in my career. Luckily, this position still allows me to write code (at least for the moment), I'm just putting in more time.

Time. The one thing we all need, and the one thing we can't make. I've put in a lot of time at the office, for both my day job and side contracts. You do what you have to do to get things done, and there are some things I'm trying to get done. That said, 2013 will have me dialing it back a bit. I have some current obligations, but I'm gonna drop back some after that, and put some time towards more important things, like my Open Source projects, development mentoring, my health, and (most importantly) my family.

In 2012 I started riding a bike (bicycle) again. Nothing fancy, just an 18 speed Mongoose from Walmart. What was important was that it got me active again. Current work load has put a temporary damper on riding, but I was doing 10+ miles a day. Time to get back into the groove. Not only is it healthy, but it's fun.

One thing I want to do this year is become more involved beyond my desk. It's time to rejoin the world. I want to start speaking to the development community again (which I started in 2012, and want to continue). I want to find a civic organization to become a part of. I want to get more active with the American Legion and the VFW. And, I want start telling Washington how I really feel about the job they're (not) doing.

2012 was the year I moved all of my Open Source projects to GitHub. Each of those projects saw some movement last year, and I'm looking to get some more spun up in 2013. Still a huge focus on dealing with ColdFusion json data, but I do have some JQuery utility bits out there, as well as starting to work on some Bootstrap components, and the Google Maps custom tag.

2012 was also a year for consulting. I've done some minor consulting in the past, but 2012 saw me traveling for consults. In one project, I consulted with a niche market company in creating an MSOC platform for their growing business, to sell and host low cost, high impact sites for their industry. For three days we hashed out exactly what it was they were trying to accomplish, going over the details of systems and code architecture, scalability, and standards. With one developer they built (from scratch), tested, and launched their new platform in six months, with their own custom CMS, templating engine and more. I enjoy consulting, particularly in addressing architecture challenges, and hope to do more of that in 2013.

So, I know some of the things I would like to do in 2013. I could map it all out, but that lacks flexibility. I didn't plan for all of the things that came my way in 2012, but most of it was for the better. May 2013 be a wonderful, and prosperous, new adventure for everyone.

KnockoutJS Starter - A Review

A few weeks back, Packt Publishing contacted me about reviewing one of their new titles, KnockoutJS Starter. Now, I'm in the middle of two contracts, plus my day job, and the holidays right now, so the idea of a "quick review" wasn't all that appealing. That said, I was interested in the material, and this is one of a new "Starter" line of books that Packt has started publishing. Basically small, quick primers that get you up and running with something new.

So, here's the "quick review". KnockoutJS Starter is by Eric M. Barnard. My e-book copy says it's 69 pages long, but the first 12 are the TOC, credits, and format info, so you take out the resources in the back of the book too and you're talking about 55 pages of meat. And there is meat.

The "Starter" books kind of come off as a printed blog series, sometimes, but Eric has done a pretty good job here, for the most part. The first half of the book takes you through installing the files, and setting up a quick sample app to take and edit inventory information. Now, it's all client side, with no data to start with, but line for line copy of the code will get you working. And, it was pretty slick how KnockoutJS ties data and interface together fairly seamlessly. And Eric explains how those connections are made very well.

While the base example, in the beginning of the book, is pretty straight forward, the second half could use some help. The second half goes beyond the basics, trying to describe Subscribables, Observables, and Bindings and Handlers. I was able to get through it, having some prior knowledge conceptually, but some of it is still confusing. The right idea was there, but the execution could use some polish and follow-up.

Ultimately, it was still a good introduction to KnockoutJS. If you aren't familiar with the library, I would take a good look at Eric and Packt's "Starter" book, and dive right in.

Mura Shared ORM Model - A Follow-Up

So, in my last post I talked about setting up a shared ORM model within Mura CMS. But, you always find the kicker after-the-fact. Mine's not a biggie though. I had setup a CF mapping to myModel

view plain print about
1<cfset this.mappings["/myModel"] = variables.mapPrefix & variables.BaseDir & "/mySite/includes/themes/mySite/model">

Turns out this wasn't the best location. I was pushing to the themes directory, because that was what the client wanted ("What the client wants....") Sometimes, you find a valid reason to deviate.

The Mura {site}/includes folder has it's own Application.cfc, with this wonderful tidbit of code in it:

view plain print about
1<cfif not listFindNoCase("styles.js.cfm,templates.js.cfm,editor.css.cfm,default.js.cfm,config.js.cfm",listLast(cgi.SCRIPT_NAME,"/"))>
2        <cfoutput>Access Restricted.</cfoutput>
3        <cfabort>
4        </cfif>

Now, most of the time this won't matter to you. Until you need to hit a remote method, of your model, for an Ajax request. Then...well, you see what happens. Now, you could probably change the Application.cfc, but I don't know if Mura won't overwrite this file on some future update, so it's better to just move my model into my {site} directory, as a sibling of the includes folder.

Creating a shared ORM model in Mura CMS

So, I'm working a new project, and using Mura CMS. We decided to write our modules as plugins, and are using the MuraFW/1 plugin template to do so. Thing is, each plugin really needs to share a common model that uses ColdFusion's ORM.

The MuraFW/1 plugin template has facility for defining a cfclocation for ORM configuration, but that location is relative to the plugin itself, so this took a little hunting. Finally, what made the most sense was to define ORM for the Mura site (as a whole), and let that definition propogate down to the plugins.

For those who are unfamiliar with Mura, it's a very nice CMS, and very extensible, but incredibly undocumented. There is some documentation, but it's spotty, and there are articles on their site that are quite dated. (I know this is something they are working on, so I'll leave it at that.) Luckily, I do write code for a living, so I just started pulling on strings until I found the thread I needed.

The MuraFW/1 template's application.cfc includes the core application settings:

view plain print about
1include '../../config/applicationSettings.cfm';

That works to our advantage, as anything defined in the core app then becomes available to the plugin. Looking at that file, I started looking for anything related to ORM. The first bit I came upon showed me this:

view plain print about
1<cfset this.ormenabled = properties.getProperty("ormenabled","true") />

From there, I had to figure out where ormenabled would come from. I discovered that all of those properties are defined in the /config/settings.ini.cfm file. So, if I added the right properties, I should have my orm configuration. Here is a list of the properties supported by the applicationSettings.cfm at this time:

  • ormenabled
  • ormdbcreate
  • ormcfclocation
  • ormflushAtRequestEnd
  • ormeventhandling
  • ormautomanageSession
  • ormsavemapping
  • ormskipCFCwitherror
  • ormuseDBforMapping
  • ormautogenmap
  • ormlogsql

So, knowing this, I started looking at my model. First, I placed the model in my theme:


This was a requirement of the client, so that was ok for me. Except now, I needed a reference to that directory. A mapping. Mura allows custom CF mappings, by making changes to the /config/mappings.cfm file:

view plain print about
1<cfset this.mappings["/myModel"] = variables.mapPrefix & variables.BaseDir & "/mysite/includes/themes/mysite/model">

Now that I had my mapping, I needed to setup the ORM settings in that settings.ini.cfm file:

view plain print about

The only thing I was missing was my ORM Event Handler. While the settings allowed me to enable ormeventhandling, they did not allow me to define the handler. For that, I added the setting in my plugin Application.cfc files, right after the initial includes:

view plain print about
1this.ormsettings.eventhandler = "myModel.aop.GlobalEventHandler";

I reloaded my application, then updated my plugins (in the Mura Plugin admin) for good measure. Presto! Shared ORM! Hopefully this will help others from spinning their wheels.

Side Note: During this process, I also updated to the Mura v6 Preview. Wow! What an improvement. And the Bootstrap usage should make layout and theming much easier.

VFS and Zip Files...Kinda

There are several posts, out there in the wild, about using ColdFusion's built-in VFS support for working with zip files. I posted the other day (and fairly quickly removed it), about using the FileMove() function to rename a zip file and all of it's contents. What I discovered, though, was that this wasn't possible. Even though the documentation states that FileMove() and FileCopy() support the in-memory file system, I found that zip files are not included in that support. Luckily there was the CFScript Community Components project, for working with zip files within script. And, though zip files were unsupported, "ram://" was still a viable option:

   *  Rename a zip file, and the internal files as well
   *  @access private
   *  @returntype boolean
   *  @output false
  function RenameZipAndContents (required string srcPath, string destPath=ARGUMENTS.srcPath, required string srcFileRoot, required string newFileRoot) {
    // Create the zip object
    var zip = CreateObject("component", "").Init();
    // Create a temp directory in RAM
    var vfsDir = "ram:///" & ARGUMENTS.newFileRoot & "/";
    DirectoryCreate(LOCAL.vfsDir & "zip");
    // Unzip the source file to the RAM directory
    zip.unzip(destination=LOCAL.vfsDir & "zip", file=ARGUMENTS.srcPath & ARGUMENTS.srcFileRoot & ".zip");
    // Get a list of the files
    var files = DirectoryList(LOCAL.vfsDir & "zip", false, "query");
    // Loop the file list
    for (LOCAL.file in LOCAL.files) {
      // Get the file extension
      var ext = Right(, 4);
      // Rename the file
      FileMove(LOCAL.vfsDir & "zip/" &, LOCAL.vfsDir & "zip/" & ARGUMENTS.newFileRoot & LOCAL.ext);
      // Zip up renamed file in new zip & ARGUMENTS.srcFileRoot & ".zip", source=LOCAL.vfsDir & "zip/" & ARGUMENTS.newFileRoot & LOCAL.ext);
      // Delete original file from zip
      zip.delete(file=ARGUMENTS.srcPath & ARGUMENTS.srcFileRoot & ".zip",;
    // Delete the temp RAM directory
    DirectoryDelete(LOCAL.vfsDir, true);
    // Rename the original zip file
    FileMove(ARGUMENTS.srcPath & ARGUMENTS.srcFileRoot & ".zip", ARGUMENTS.destPath & ARGUMENTS.newFileRoot & ".zip");

return true; }

Yes, that's a lot of jumping through hoops, and the multiple zip operations really drag out something that should be pretty simple. I'm not sure why zip isn't supported by these operations. Maybe some future revision will correct that.

Bootstrap Tree

It'll be a little while before I add this to the projects link on the site, but yesterday I pushed a new project up to GitHub. Bootstrap Tree is a lightweight Tree component, for use with the Bootstrap framework. This is still a work in progress, and very bare bones at the moment, but basically you write some formatted HTML (nested lists with data attributes), include the css and js (very small) and it works. Currently you'll have to download the code for the example, but I welcome any feedback, suggestions, comments, etc.

I can think of several things to add to this project, but what do you look for in a tree component?

ColdFusion Roadmap

Shilpi, the 'Security Czar' of Adobe's ColdFusion Engineering team, recently posted about the Roadmap for future ColdFusion Server Devlopment, post CF 10. This links to an abbreviated set of slides, presented in a PDF document, that layout the focus on next two versions of CF.

There are some things you might easily miss, in reading over the slides. First thing I picked out was in "Splendor"'s Other focus areas section, you see Pluggable Framework mentioned. Hmmmmmm...

Mobile, Social, HTML 5 and the Cloud are big topics here, but I also noted that "Dazzle" has Customizable Enterprise Video Portal mentioned. Interesting...

Another one that's easy to miss? How about the timeline? According to the last slide, "Splendor" looks like a 2013 release, while "Dazzle" is slated for 2014. That's a much more progressive release cycle than we're used to seeing.

The biggest, immediate take away here, is the fact that Adobe is obviously investing time and resources in to continuing to produce and progress the ColdFusion platform. That's a win.

ColdFusion + Ext JS Position: Los Angeles

This was forwarded to me yesterday. Anyone who might be interested, ping me on the contact form and I'll forward you the details:

ColdFusion Developer will be responsible for the development of financial reporting systems. He/She will also develop detailed system design and programming specifications, support daily business activity by providing technical support of systems and regularly meet with the IT project lead to review progress and problems related to the job. Additionally he/she will design intuitive and effective UIs using modern client-side technologies, including AJAX, Sencha Ext JS, and other JavaScript libraries.

ColdFusion developer with 5 years+ experience. Knowledge of ColdFusion CFC components, and MVC frameworks, and current feature set in ColdFusion 9.

Knowledge of (Sencha/4.1) Ext JS

Excellent knowledge of JavaScript, HTML, CSS, Web services, and importing Web-based data to Excel.

Good written and verbal communication skills.

Maintains a solid knowledge of information system software development life cycle and quality assurance

Demonstrates proficiency in systems analysis of business requirements.

Good knowledge of relational databases and SQL, experience with Oracle including writing stored procedures, triggers, views etc?

Previous Entries / More Entries