Я использую php-скрипт для загрузки с моего сайта после необходимого таймера javascript, который включен в этот php-скрипт, который вызывает загрузку. Но загруженный файл поврежден независимо от того, что я пытаюсь. Может ли кто-нибудь помочь мне указать, где я ошибаюсь.
Это мой код
<?php include "db.php"; $id = htmlspecialchars($_GET['id']); $error = false; $conn = mysql_connect(DB_HOST,DB_USER,DB_PASSWORD); if(!($conn)) echo "Failed To Connect To The Database!"; else{ if(mysql_select_db(DB_NAME,$conn)){ $qry = "SELECT Link FROM downloads WHERE ID=$id"; try{ $result = mysql_query($qry); if(mysql_num_rows($result)==1){ while($rows = mysql_fetch_array($result)){ $f=$rows['Link']; } //pathinfo returns an array of information $path = pathinfo($f); //basename say the filename+extension $n = $path['basename']; //NOW comes the action, this statement would say that WHATEVER output given by the script is given in form of an octet-stream, or else to make it easy an application or downloadable header('Content-type: application/octet-stream'); header('Content-Length: ' . filesize($f)); //This would be the one to rename the file header('Content-Disposition: attachment; filename='.$n.''); //Finally it reads the file and prepare the output readfile($f); exit(); }else $error = true; }catch(Exception $e){ $error = true; } if($error) { header("Status: 404 Not Found"); } } } ?>
Прежде всего, как некоторые люди отметили комментарии, удалите все пробелы перед первым PHP-тегом ( <?php
) в первой строке, и это должно сделать трюк (если этот файл не включен или не требуется каким-либо другим файлом).
Когда вы печатаете что-либо на экране, даже на одном месте, ваш сервер будет отправлять заголовки вместе с печатаемым контентом (в случае, ваши пробелы). Чтобы этого не произошло, вы можете:
a) ничего не печатать, прежде чем вы закончите писать заголовки;
b) запустите ob_start () как первое, что нужно в вашем скрипте, напишите материал, отредактируйте заголовки, а затем ob_flush () и ob_clean (), когда вы хотите, чтобы ваш контент отправлялся в браузер пользователя.
В б), даже если вы успешно напишете заголовки, не получив ошибку, пробелы испортит ваш двоичный файл . Вы должны писать только бинарный контент, а не несколько пробелов с двоичным содержимым.
Префикс ob_ означает выходной буфер. При вызове ob_start()
вы сообщаете своему приложению, что все, что вы выводите ( echo
, printf
и т. Д.), Должно храниться в памяти до тех пор, пока вы явно не ob_flush()
ему «go» ( ob_flush()
) клиенту. Таким образом, вы держите вывод вместе с заголовками, и когда вы закончите писать их, они будут отправлены просто отлично вместе с контентом.
Это помогло мне в случае открытия большего количества выходных буферов.
//NOW comes the action, this statement would say that WHATEVER output given by the script is given in form of an octet-stream, or else to make it easy an application or downloadable header('Content-type: application/octet-stream'); header('Content-Length: ' . filesize($f)); //This would be the one to rename the file header('Content-Disposition: attachment; filename='.$n.''); //clean all levels of output buffering while (ob_get_level()) { ob_end_clean(); } readfile($f); exit();