PHP script for download images

software development

#1

Hello,

i was running into a curious problem…
I have a php script which downloads a image from a secure folder (…/) to the users folder.
If you run this scrip directly over the browsers addressbar it comes up with the download window where to store.
But if i run it linked over a button from my site nothing is happening. Looking in the access.log file shows my the right string for running the script - copy paste it to the browserbar and … the dialog pop’s up.

Have anyone encountered souch a behavior?
Any ideas?

thanks
riko


#2

With out seeing the code, I can only speculate. It sounds like your php code only created a link to the image.
Instead Create another php script that has the header info for the image and use imagegd to send to the browser.
http://us.php.net/manual/en/ref.image.php
Silk

My website


#3

Maybe as an additional information, the script is called from an swf by loadVariablesNum.
If i do it with getURL… and _blank it works also, but i dont want to open a blank window for downloading…

Here is the code:

<?PHP require("../sicher/include/verbinden.php"); /** * Foto downloaden * * Systemvoraussetzung: * Linux * PHP 4 >= 4.2.0, PHP 5 * * Foto downloaden * */ function readfile_chunked($filename,$retbytes=true) { # from: http://nl2.php.net/manual/nl/function.readfile.php $chunksize=1*(64*1024); // how many bytes per chunk $buffer=''; $cnt=0; $handle=fopen($filename, 'rb'); if ($handle===false) { return false; } while (!feof($handle)) { $buffer=fread($handle,$chunksize); echo $buffer; ob_flush(); flush(); if ($retbytes) { $cnt+=strlen($buffer); } } $status=fclose($handle); if ($retbytes && $status) { return $cnt; // return num. bytes delivered like readfile() does. } return $status; } function makeDownload($file, $full, $type) { if (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE")) { $file = preg_replace('/\./', '.', $file, substr_count($file, '.') - 1); } //Begin writing headers header("Pragma: public"); header("Expires: 0"); header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); header("Cache-Control: public"); header("Content-Description: File Transfer"); //Use Content-Type header("Content-Type: application/octet-stream"); //Force the download $header="Content-Disposition: attachment; filename=".$file.";"; header($header ); header("Content-Transfer-Encoding: binary"); header("Content-Length: ".filesize($full)); ignore_user_abort(true); $sent = readfile_chunked($full); if(!connection_aborted()){ unlink(); return $sent; } else { //perhaps some logging, which is why I set the ignore_user_abort() to true return 0; } } $type = 'application/zip'; $checkedCat = (int)$_GET["cat"]; $checkedSub = (int)$_GET["sub"]; $invoice=$_GET['Invoice']; $custom=$_GET['pin_code']; $itemname=$_GET['Itemname']; if(!preg_match("/^[0-9a-f]{32,32}$/i", $invoice)){ exit; } if(!preg_match("/^photo_[1-9][\.][0-9]{1,9}$/", $itemname)){ exit; } $dir = '../sicher/download/images/'.$checkedCat.'/'.$checkedSub.'/'; $invoice = AESdecode($invoice); // PIN auf Gültigkeit Prüfen $sql="select idx from customer_pin where invoice = '".$invoice."' and pin = '".$custom."' and access > (NOW() - INTERVAL 24 HOUR)"; $query=mysql_query($sql, GetMyConnection()); $anz = mysql_num_rows($query); CleanUpDB(); if ($anz<1){ exit; } if(($checkedCat!=0) && ($checkedSub!=0)) { if(!empty($_GET['file']) && !preg_match('=/=', $_GET['file'])) { if(file_exists ($dir.$_GET['file'].'.zip')) { $fsize = filesize($dir.$_GET['file'].'.zip'); $bsent = makeDownload(basename($_GET['file']), $dir.$_GET['file'].'.zip', $type); if($bsent==$fsize) { // Download Zähler erhöhen $sql="update paypal_cart_info set downloaded = downloaded + 1 where itemname = '".$itemname."' and invoice = '".$invoice."' and custom = '".$custom."'"; $query=mysql_query($sql, GetMyConnection()); CleanUpDB(); } } } } ?>

#4

Finally i got it worked.

I use now print instead of echo.
Don’t know why this makes the different, but i must not know all secrets…

Bye.