Styling file upload form buttons in Drupal

Posted on: 07 November 2008

I've used a nice bit of CSS to style all the buttons throughout our web site, but it all falls down a bit on the file upload button. For reasons best known only to the various browser developers, this button only has limited styling capability, if indeed any at all.

There are a few solutions out there, but they are all pretty messy in terms of adding a lot of cruft to your site code. I was looking for something a bit more elegant, and which would fit neatly in with the architecture of my Drupal-based site.

Fairly unsurprisingly, the answer lay with jQuery (something I find I've been saying rather a lot lately!). Translating the solution to Drupal turns out to be as simple as downloading the jQuery File Style plugin, then implementing hook_form_alter and modifying the form:

function mymodule_form_alter($form_id, &$form) {
  if($form_id == 'user_edit') {
    // add support for styling the file upload button
    drupal_add_js('misc/jquery.filestyle.mini.js');

    $form['picture']['#suffix'] = '
<script type="text/javascript">
  $("input[type=file]").filestyle({ 
  image: "/'.path_to_theme().'/img/file_upload_button.gif",
  imageheight : 22,
  imagewidth : 82,
  width : 250
});
</script>';
    
  }
}


(and making your button image, of course)

Works great in IE6, IE7 and FF3