<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 TRANSITIONAL//EN">
<HTML>
<HEAD>
  <META HTTP-EQUIV="Content-Type" CONTENT="text/html; CHARSET=UTF-8">
  <META NAME="GENERATOR" CONTENT="GtkHTML/3.24.5">
</HEAD>
<BODY>
Yeah, that sounds familiar.&nbsp; The real booger was figuring out for each browser what it wanted to see in the headers for those various file types. <BR>
<BR>
On Wed, 2011-01-12 at 15:07 -0500, Mike Harrison wrote: 
<BLOCKQUOTE TYPE=CITE>
<PRE>
&gt; It's a moderate booger to write the thing that spits back the file
&gt; inline, since we might have .pdf files, .html files, text files, and I
&gt; recall we had to do content headers appropriately.

This is fairly easy to do in PHP, and I expect other languages as well.

This is the two fragments from a bigger program that demonstrate a method.

#FRAGMENT 1
     $file_extension = strtolower(substr(strrchr($filename, &quot;.&quot;), 1));
     switch ($file_extension) {
         case &quot;pdf&quot;:
             $ctype = &quot;application/pdf&quot;;
         break;
         case &quot;csv&quot;:
             $ctype = &quot;application/text&quot;;
         break;
         case &quot;xls&quot;:
             $ctype = &quot;application/vnd.ms-excel&quot;;
         break;
         default:
             $ctype = &quot;application/force-download&quot;;
     }



#FRAGMENT2:

     header(&quot;Pragma: public&quot;);
     header(&quot;Expires: 0&quot;);
     header(&quot;Cache-Control: must-revalidate, post-check=0, pre-check=0&quot;);
     header(&quot;Cache-Control: private&quot;, false);
     header(&quot;Content-Type: $ctype&quot;);
     header(&quot;Content-Disposition: attachment; filename=\&quot;&quot; . basename($as) . &quot;\&quot;;&quot;);
     header(&quot;Content-Transfer-Encoding: binary&quot;);
     header(&quot;Content-Length: &quot; . @filesize($filename));
#    set_time_limit(20);
     ob_clean();
     flush();
     @readfile(&quot;$filename&quot;) or die(&quot;File not found.&quot;);

</PRE>
</BLOCKQUOTE>
</BODY>
</HTML>