Я взял и изменил код загрузки PHP, но всегда получаю эту ошибку:
Предупреждение: fclose () ожидает, что параметр 1 будет ресурсом, логическое значение указано в /web/htdocs/www.mysite.org/home/DDL/download.php в строке 60
Где, очевидно, «www.mysite.org» изменяется с URL моего сайта.
Я искал другие вопросы, но были только похожие проблемы, не идентичные, с разными случаями.
Сценарий таков:
<?php
ignore_user_abort(true);
set_time_limit(0);
$path = "/DDL/FILES/";
$dl_file = preg_replace("([^\w\s\d\-_~,;:\[\]\(\).]|[\.]{2,})", '', $_GET['download_file']);
$dl_file2 = filter_var($dl_file, FILTER_SANITIZE_URL);
$fullPath = $path.$dl_file2;
if ($fd = fopen ($fullPath, "r")) {
$fsize = filesize($fullPath);
$path_parts = pathinfo($fullPath);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
case "zip":
header("Content-type: application/zip");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
case "mkv-video":
header("Content-type: video/x-matroska");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
case "mp4-video":
header("Content-type: video/mp4");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
case "aac":
header("Content-type: audio/aac");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
case "flac":
header("Content-type: audio/x-flac");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
case "mp3":
header("Content-type: audio/mpeg");
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
break;
default;
header("Content-type: application/octet-stream");
header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
break;
}
header("Content-length: $fsize");
header("Cache-control: private");
while(!feof($fd)) {
$buffer = fread($fd, 2048);
echo $buffer;
}
ob_clean();
flush();
fclose ($fd);
} else {
echo 'something wrong with the file?';
}
exit;
Я провел некоторые исследования и поговорил с некоторыми людьми, и мы пришли к выводу, что это может быть ошибка БД, потому что все, что мы пробовали, не решало проблему.
Может кто-нибудь помочь мне исправить эту ошибку?
Заранее спасибо.
Давайте начнем со следующей строки:
if ($fd = fopen ($fullPath, "r")) {
«Что с этим не так?» Вы можете спросить. Ну если fopen
возвращается FALSE
Ваше выражение не оценивается, и вы в конечном итоге пропускаете выполнение
ob_clean();
flush();
fclose ($fd);
И с тех пор $fd
не определен в этой области … Вы должны были уже догадаться.
Переместите свой код после if
заявление внутри if
заявление:
if ($fd = fopen ($fullPath, "r")) {
// the rest of the code that could have been cropped
ob_clean();
flush();
fclose ($fd);
} else {
echo 'something wrong with the file?';
}
exit;
попробуйте что-нибудь более простое, как показано ниже:
if (($fd = fopen($file, "a")) !== false) {
fwrite($fd, 'message to be written' . "\n");
fclose($fd);
}
затем попробуйте интегрировать его в свой скрипт.