<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Knowledge Sharing &#187; Download</title>
	<atom:link href="http://blog.danigunawan.com/tag/download/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.danigunawan.com</link>
	<description>"Say it... although a word..."</description>
	<lastBuildDate>Wed, 25 Jan 2012 00:14:12 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Avoid Direct Download</title>
		<link>http://blog.danigunawan.com/web/avoid-direct-download/</link>
		<comments>http://blog.danigunawan.com/web/avoid-direct-download/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 02:29:00 +0000</pubDate>
		<dc:creator>Dagu</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Download]]></category>

		<guid isPermaLink="false">http://blog.danigunawan.com/2007/12/19/mencegah-direct-download/</guid>
		<description><![CDATA[Case study: We would like to provide pdf files to be downloaded by visitors, but the file location is hidden. Visitors can download file with URL given only. Programming language used is PHP. Analysis: We could make a link directly to the file location. Example: &#60;a href="myebook.pdf"&#62;Download MyEbook&#60;/a&#62; What happen if the link above clicked? [...]
Related posts:<ol>
<li><a href='http://blog.danigunawan.com/database/creating-database-in-mysql/' rel='bookmark' title='Creating Database in MySQL'>Creating Database in MySQL</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><span style="font-weight: bold;">Case study:</span><br />
We would like to provide pdf files to be downloaded by visitors, but the file location is hidden. Visitors can download file with URL given only. Programming language used is PHP.</p>
<p><span style="font-weight: bold;">Analysis:</span><br />
We could make a link directly to the file location. Example:</p>
<pre><span style="font-family: courier new;">&lt;a href="myebook.pdf"&gt;Download MyEbook&lt;/a&gt;</span></pre>
<p>What happen if the link above clicked? It depends to the visitors&#8217; browser. If the plugin to read pdf is installed, then browser will open that file inside browser. But, how if there&#8217;s no pdf reader plugin? Then a save file dialog box appear. We could save that file.</p>
<p>A problem is done if the visitors don&#8217;t have pdf reader plugin. But what about the visitors who have it? Of course the problem is not solved. Another problem is the visitors know the file location,  so it allows the visitors to download the file directly (download it directly by typing/copy paste the URL in the browser, without clicking from link given).</p>
<p><span id="more-92"></span></p>
<p><span style="font-weight: bold;">Solution:</span><br />
We need a bit code (PHP) to solve this problem.</p>
<p>The code to avoid direct download is shown below:</p>
<div class="geshi no php">
<div class="head">$task = $_REQUEST[&#39;task&#39;];</div>
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">switch</span><span class="br0">&#40;</span><span class="re1">$task</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="kw1">case</span> <span class="st0">&#39;download&#39;</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="co1">// file location</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="re1">$file_path</span> <span class="sy0">=</span> <span class="st0">&#39;dl/myebook.pdf&#39;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"> <span class="co1">// function to get file name without path</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="re1">$file_name</span> <span class="sy0">=</span> <span class="kw3">basename</span><span class="br0">&#40;</span><span class="re1">$file_path</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"> <span class="co1">// get file size</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="re1">$fsize</span> <span class="sy0">=</span> <span class="kw3">filesize</span><span class="br0">&#40;</span><span class="re1">$file_path</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"> <span class="co1">// set headers</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Pragma: public&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Expires: 0&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Cache-Control: must-revalidate, post-check=0, pre-check=0&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Cache-Control: public&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Description: File Transfer&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Type: application/pdf&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&#39;Content-Disposition: attachment; filename=&quot;&#39;</span> <span class="sy0">.</span> <span class="re1">$file_name</span> <span class="sy0">.</span> <span class="st0">&#39;&quot;&#39;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Transfer-Encoding: binary&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="kw3">header</span><span class="br0">&#40;</span><span class="st0">&quot;Content-Length: &quot;</span> <span class="sy0">.</span> <span class="re1">$fsize</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"> <span class="co1">// start downloading from here</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="re1">$file</span> <span class="sy0">=</span> <span class="sy0">@</span><span class="kw3">fopen</span><span class="br0">&#40;</span><span class="re1">$file_path</span><span class="sy0">,</span><span class="st0">&quot;rb&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re1">$file</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> </div>
</li>
<li class="li1">
<div class="de1">   <span class="kw1">while</span><span class="br0">&#40;</span><span class="sy0">!</span><span class="kw3">feof</span><span class="br0">&#40;</span><span class="re1">$file</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span> </div>
</li>
<li class="li1">
<div class="de1">   <span class="kw3">print</span><span class="br0">&#40;</span><span class="kw3">fread</span><span class="br0">&#40;</span><span class="re1">$file</span><span class="sy0">,</span> <span class="nu0">1024</span><span class="sy0">*</span><span class="nu0">8</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">   <span class="kw3">flush</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">     <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">connection_status</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">!=</span><span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">         <span class="sy0">@</span><span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re1">$file</span><span class="br0">&#41;</span><span class="sy0">;</span> </div>
</li>
<li class="li1">
<div class="de1">         <span class="kw3">die</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">     <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">   <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">   <span class="sy0">@</span><span class="kw3">fclose</span><span class="br0">&#40;</span><span class="re1">$file</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"> <span class="kw1">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"> <span class="kw2">default</span><span class="sy0">:</span></div>
</li>
<li class="li1">
<div class="de1">   <span class="kw3">echo</span> <span class="st0">&#39;&lt;a href=&quot;dlfile.php?task=download&quot;&gt;Download MyEbook&lt;/a&gt;&#39;</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1">   <span class="kw1">break</span><span class="sy0">;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>You need to concern to this line:</p>
<pre><span style="font-family: courier new;">header('Content-Disposition: attachment; filename="myebook.pdf"');</span></pre>
<p>This line forces browser to show save dialog box for &#8220;myebook.pdf&#8221; although there&#8217;s pdf reader plugin in the browser.</p>
<p>To change file type (exe or zip), we need to change Content-Type only. Here are the lists:</p>
<pre><span style="font-family: courier new;">// archives</span>
<span style="font-family: courier new;">application/zip</span></pre>
<pre><span style="font-family: courier new;">// documents</span>
<span style="font-family: courier new;">application/pdf</span>
<span style="font-family: courier new;">application/msword</span>
<span style="font-family: courier new;">application/vnd.ms-excel</span>
<span style="font-family: courier new;">application/vnd.ms-powerpoint</span>
<span style="font-family: courier new;">// executables</span>
<span style="font-family: courier new;">application/octet-stream</span></pre>
<pre><span style="font-family: courier new;">// images</span>
<span style="font-family: courier new;">image/gif</span>
<span style="font-family: courier new;">image/png</span>
<span style="font-family: courier new;">image/jpeg</span><span style="font-family: courier new;">
</span></pre>
<pre><span style="font-family: courier new;">// audio</span>
<span style="font-family: courier new;">audio/mpeg</span>
<span style="font-family: courier new;">audio/x-wav</span></pre>
<pre><span style="font-family: courier new;">// video</span>
<span style="font-family: courier new;">video/mpeg</span>
<span style="font-family: courier new;">video/quicktime</span>
<span style="font-family: courier new;">video/x-msvideo</span></pre>
<p>File starts downloading from the line after this line:</p>
<pre><span style="font-family: courier new;">// start downloading from here</span></pre>
<p>There&#8217;s a question. Why do we need to avoid direct download? The purpose is to check how many times a file has been downloaded. If the visitors are allowed to download files directly, I&#8217;m sure it will be difficult to know how many times a file is downloaded. If you don&#8217;t need to check how many times the visitors download your files, you could use both direct download or indirect download.</p>
<p>Related posts:<ol>
<li><a href='http://blog.danigunawan.com/database/creating-database-in-mysql/' rel='bookmark' title='Creating Database in MySQL'>Creating Database in MySQL</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.danigunawan.com/web/avoid-direct-download/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

