|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2007-11-15 18:17 UTC] d dot tas40 at chello dot nl
Description:
------------
File Download Problem.
Reproduce code:
---------------
// set 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");
header("Content-Type: $mtype");
header("Content-Disposition: attachment; filename=\"$filename\"");
header("Content-Transfer-Encoding: binary");
header("Content-Length: " . $filesize);
// download
// @readfile($file_path);
$file = @fopen($file_path,"rb");
if ($file) {
while(!feof($file)) {
print(fread($file, 1024*8));
flush();
if (connection_status()!=0) {
@fclose($file);
die();
}
}
@fclose($file);
}
Expected result:
----------------
It works fine with PHP v5.2.3/4 but after I updated my PHP version to 5.2.5 it doesn't work..
I click on the download link, but the downloaded file always corrupt..
xxx.rar: The archive is either in unknown format or damaged!
xxx.rar: The archive is either in unknown format or damaged!
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Nov 24 16:00:01 2025 UTC |
I have a similar problem with PHP 5.2.4 / 5.2.5 with Apache2.2 under Windows 2003. Downloaded files are missing exactly 15 bytes at the end. ZIP and RAR files can't be opened correctly after download but definitely are okay on the server's hard drive. With $filesize=filesize($filename)+15; the downloads are working. $size = @filesize($filename)+15; header('Pragma: public'); [...] header("Content-Length: $size"); $fp = @fopen($filename, 'rb'); [...] while (!feof($fp)){ echo fread($fp, 8192); } fclose($fp); [...] flush();I have the very same problem, but my host server is PHP Version 4.3.11 with Linux OS, i use the following code snippest to recieve the file from form and upload it to a BLOB field in SQL, the code works fine with all file extensions, except rar and zip files, they mostly are corrupted. upload.php <?php if(isset($_POST['upload']) && $_FILES['userfile']['size'] > 0) { $fileName = $_FILES['userfile']['name']; $tmpName = $_FILES['userfile']['tmp_name']; $fileSize = $_FILES['userfile']['size']; $fileType = $_FILES['userfile']['type']; $fp = fopen($tmpName, 'r'); $content = fread($fp, filesize($tmpName)); $content = addslashes($content); fclose($fp); if(!get_magic_quotes_gpc()) { $fileName = addslashes($fileName); } include('conf.php'); // open database connection $connection = mysql_connect($host, $user, $pass) or die ('Unable to connect!'); // select database mysql_select_db($db) or die ('Unable to select database!'); $query = "INSERT INTO upload (name, size, type, content ) ". "VALUES ('$fileName', '$fileSize', '$fileType', '$content')"; mysql_query($query) or die('Error, query failed ' . mysql_error()); ?> //////////////////////////////////////////////////////////////////// download.php <?php if(isset($_GET['id'])) { // if id is set then get the file with the id from database include('conf.php'); // open database connection $connection = mysql_connect($host, $user, $pass) or die ('Unable to connect!'); // select database mysql_select_db($db) or die ('Unable to select database!'); $id = $_GET['id']; $query = "SELECT name, type, size, content " . "FROM upload WHERE id = '$id'"; $result = mysql_query($query) or die('Error, query failed'); list($name, $type, $size, $content) = mysql_fetch_array($result); header("Content-length: $size"); header("Content-type: $type"); header("Content-Disposition: attachment; filename=$name"); } php echo $content; ?>Using strlen of the blob instead of filesize in the header works for me. Example - header("Content-Length: ".strlen($blob_data)); Hope this helps someone.I have the same issue with PHP 4.449 and 4.1.2.0 mysql. and worked fine with pervious version. can somone shed some light on this? here is the code I'm using mysql_select_db($database_tred, $conn); $query = sprintf("SELECT * FROM Files WHERE Files.FileID = %s", $TID_Recordset1); $result = MYSQL_QUERY($query, $tred)or die(mysql_error()); $data = MYSQL_RESULT($result,0,"filename"); $type = MYSQL_RESULT($result,0,"filetype"); $filesize = MYSQL_RESULT($result,0,"filesize"); $file = MYSQL_RESULT($result,0,"bin_data"); if($result) { header("Content-Tranfer-Encoding: binary"); header("Content-Disposition: attachment; filename= $data"); header("Content-length: $filesize"); header("Content-Description: PHP Generated Data"); print ($file);let try this , i think it's ok $file = @fopen($download_location,"rb"); if($fopen != NULL) { 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"); header("Content-Type: application/force-download",FALSE); header("Content-Type: application/x-zip-compressed",FALSE); header("Content-Type: application/download", FALSE); header("Content-Disposition: attachment; filename=\"$this->FileName\""); header("Content-Transfer-Encoding: binary"); header("Content-Length: " . filesize($download_location) + 100); fpassthru($fopen); fclose($fopen); exit(); }