Hitting a download link and displaying text in the same menu item page callback (7) I have a menu item for one of my content types that I want to be able to package up some different files, create a .zip file, link to start a download and then display some text which will describe what the user needs to do with the .zip file.  

Here is my menu declaration:

        'title' =&gt; 'Download Icon',
        'description' =&gt; 'Package up the selected icon as a zip file and download it',
        'page callback' =&gt; 'download_icon_page_callback',
        'page arguments' =&gt; array(1), 
        'access callback' =&gt; 'download_icon_access',
        'access arguments' =&gt; array(1), 
        'type' =&gt; MENU_LOCAL_TASK,
        ),


And here is my page callback that doesn't work for obvious reason:

function download_icon_page_callback()
{
    // some code to compile my .zip file
    drupal_goto('path/to/my/file.zip');
    return t('Here are some inustrctions!');
}


So this above function can link to the file compiled .zip with a drupal_goto but since this a redirect the return t will not ever go through.  Is there anyway I can hit both of these in a single page callback?  Also, is there a better way to display formatted text from the menu item instead of just doing a return t() from my page callback?
A particularly low-tech solution using meta refresh (which should work cross-browser):

function download_icon_page_callback() {
  $element = array(
    '#tag' =&gt; 'meta', 
    '#attributes' =&gt; array( 
      'http-equiv' =&gt; 'refresh',
      'content' =&gt; '5', // Timeout in seconds
      'url' =&gt; '/path/to/my/file.zip'
    ),
  );

  drupal_add_html_head($element, 'download_icon_refresh');

  return array(
    'instructions' =&gt; array(
      '#markup' =&gt; t('Some instructions')
    ),
    'backup_link' =&gt; array(
      '#markup' =&gt; l('Click here if the file download does not automatically start.', 'path/to/my/file.zip'),
      '#prefix' =&gt; '&lt;p&gt;',
      '#suffix' =&gt; '&lt;/p&gt;'
    )
  );
}


Although returning a string from a page callback function works fine (the return is run through render() which accepts a string or render array), returning a render array is preferred as it gives other parts of the system the chance to alter the output while it's still in a structured manner. The documentation for render arrays is a great place to start if you haven't used them before.