Force PDF to download instead of opening automatically

I have a button that is connected to a PDF.  When I click the button, it opens a window and tries to open the file via the browser.  It takes forever because the file is 16 MB.  I'd rather have the button force to a download when it is clicked.  Can someone help me with this?  Here is the current button tag:
<input type="button" name="TheManual" value="The Manual"  alt="The Manual"onclick="window.open(href='supportdocs/manuals/TheManual.pdf','TheManual');window.event.returnValue=false;">
sulzenerAsked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

SidFishesCommented:
you need to use cfcontent/cfheader with content-disposition

to get this to work on button click you would need to have some js to open a url with that code

<script type="text/javascript">

function goToURL(aURL)
            {
                  self.location = aURL;
            }
</script>

<input type="button" name="TheManual" value="The Manual"  alt="The Manual"onclick="goToURL(pdfDLTrigger.cfm);">

pdfTrigger.cfm
------------


<cfset filePath="supportdocs/manuals/TheManual.pdf">
<cfheader name="Content-Disposition" value="attachment; filename=#getFileFromPath (filePath)#">
<cfcontent file="#filePath#" type="application/octet-stream">

0
sulzenerAuthor Commented:
Thank you.  Is there a way to pass the filename and filepath as URL so that I can use the pdfTrigger.cfm for more than one file name?
0
SidFishesCommented:
sure

onclick="goToURL(pdfDLTrigger.cfm?filename=#filename#);">

then

<cfset filePath="supportdocs/manuals/#url.filename#">
<cfheader name="Content-Disposition" value="attachment; filename=#getFileFromPath (filePath)#">
<cfcontent file="#filePath#" type="application/octet-stream">
0
Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

sulzenerAuthor Commented:
SidFishes, I am havig trouble getting anything to work.  Even he first suggestions.  I am getting a HTTP 500 Internal Server Error.  I've tried both location.href and self.location in the javascript.  Can you take a look and see what I might be doing wrong?

<input type="button" name="TheManual" value="The Manual"  alt="TheManual" onclick="goManualDownload()">

<script language="JavaScript">
function goManualDownload()
{
var Backlen=history.length;
history.go(-Backlen);
self.location ="FileDownTrigger.cfm?str_filenm=TheManual.pdf&str_pathnm=/supportdocs/";
}
</script>            
      
--------------------
FileDownTrigger.cfm
--------------------
<CFSET filename = url.str_filenm>
<CFSET filepath = url.str_pathnm>
<CFSET fullpath = filepath & filename>
<cfheader name="Content-Disposition" value="attachment; filename=#getFileFromPath (fullpath)#">
<cfcontent file="#fullpath#" type="application/octet-stream">

--------------------
I've also tried using this CFHEADER logic.  Get the same thing:
<CFHEADER NAME="content-disposition" VALUE="attachment; filename=#filename#">
0
SidFishesCommented:
here's a better version using a hidden iframe
 in this example the pdf is in a sub folder one level below (you may need to play with paths a bit)

cfcontent needs the absolute path (which it can get from expandpath)

 
<script language="JavaScript">
function goManualDownload()
{
	window.frames.frm.location.href = 'filedowntrigger.cfm?str_filenm=theManual.pdf&str_pathnm=test1/';
}
</script>            
 
<input type="button" name="TheManual" value="The Manual"  alt="TheManual" onclick="goManualDownload();">
<iframe	id="frm" src="filedowntrigger.cfm" name="frm" style="display:none;"></iframe>
	
 
--------------------
FileDownTrigger.cfm
--------------------
 
<cfoutput>
<cfif isdefined('url.str_filenm')>
	<CFSET filepath = url.str_pathnm>
	<CFSET filename = url.str_filenm>
	<CFSET fullpath = filepath & filename>
	 <cfheader name="Content-Disposition" value="attachment; filename=#filename#">
	 <cfcontent file="#expandpath(fullpath)#" type="application/octet-stream">   
</cfif>
</cfoutput>

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
sulzenerAuthor Commented:
Thanks, I think most of my problem was that I needed the expandpath help.  Also, I could only get it to work when passing the str_filenm only as URL.  If I tried to pass the file and path (str_filenm and str_pathnm), it failed.  I had to hard code the path name in the FileDownTrigger.cfm.  Any clues why that might be the case?
0
SidFishesCommented:
I did test my code and it worked as is with both url vars so not sure why it didn't for you

if you tried this

&str_pathnm=/supportdocs/";

maybe try

&str_pathnm=supportdocs/";
0
sulzenerAuthor Commented:
I can tell that the path is coming through to the FileDownTrigger.cfm because I added this:
<CFABORT showerror=#expandpath(fullpath)#>
It all looks good on the abort.  But when I take it out, it doesn't work.  Just seemed odd to me.  The oly difference is that mine goes down multile levels. For instance:
window.frames.frm.location.href = 'FileDownTrigger.cfm?str_filenm=TheManual.pdf&str_pathnm=supportdocs/docmgr/manuals/';
0
SidFishesCommented:
hmmm.. just tried this

?str_filenm=theManual.pdf&str_pathnm=test1/lev2/'

and it worked..

are you sure the folder permissions are set correctly?

0
sulzenerAuthor Commented:
No, I am not sure.  But I know that if I hardcode the path in the FileDownTrigger.cfm it woks.  So I am assuming they are.  How do I check that?
0
SidFishesCommented:
you're right ..if it works hard coded it wouldn't be a perms problem...

can you post your non hard coded code

0
sulzenerAuthor Commented:

-------------------
DownloadManual.cfm
-------------------
<input type="button" name="DownloadManual" value="  Download Manual"  alt="Download Manual" onclick="goDownloadManual()">
<iframe	id="frm" src="filedowntrigger.cfm" name="frm" style="display:none;"></iframe>
 
<script language="JavaScript">	
<!--
function goDownloadManual()
	{
	window.frames.frm.location.href = 'FileDownTrigger.cfm?str_filenm=TheManual.pdf&supportdocs/docmgr/manuals/'; 
	}
//-->	
</script>		
-------------------
FileDownTrigger.cfm
-------------------
<cfoutput>
<cfif isdefined('url.str_filenm')>
	<CFSET filepath = url.str_pathnm>
	<!--- <CFSET filepath="supportdocs/docmgr/manuals/"> --->
	<CFSET filename = url.str_filenm>
	<CFSET fullpath = filepath & filename>
	<!--- <CFABORT showerror=#expandpath(fullpath)#> --->
	 <cfheader name="Content-Disposition" value="attachment; filename=#filename#">
	 <cfcontent file="#expandpath(fullpath)#" type="application/octet-stream">   
</cfif>
</cfoutput>

Open in new window

0
SidFishesCommented:
window.frames.frm.location.href = 'FileDownTrigger.cfm?str_filenm=TheManual.pdf&supportdocs/docmgr/manuals/';

is missing str_pathnm=

should be
                                               
window.frames.frm.location.href = 'FileDownTrigger.cfm?str_filenm=TheManual.pdf&str_pathnm=supportdocs/docmgr/manuals/';
0
DippiesCommented:
Hi, I am new to PHP stuffs. Just wondering, in this discussion, can we rewrite FileDownTrigger.cfm in any other format? Say .jsp or .php? If yes, can you provide me the alternate code in .jsp or .php? Thanks.
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
HTML

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.