Я пытаюсь заставить этот код работать, но по какой-то причине все эхо-файлы могут выводить правильный контент, но заголовки, похоже, не хотят принудительно загружать мой документ. Ниже следует файл, который я пытаюсь создать для загрузки файлов. Он установлен для ввода кода следующим образом: downloader.php?f=13&t=doc
для загрузки файла с именем 201-xxx.doc
или 201-xxx.pdf
из одной из двух папок в зависимости от привилегий пользователей.
Вся логика работает с информацией заголовка внизу. Если я прокомментирую тип содержимого заголовка и расположение содержимого заголовка, он будет читать файл в браузере. При использовании любой из этих строк он дает мне сообщение об ошибке "Error 6 (net::ERR_FILE_NOT_FOUND): The file or directory could not be found."
<?php //ob_start(); if ( !defined('__DIR__') ) define('__DIR__', dirname(__FILE__)); define( "TLOJ_FSROOT", __DIR__ . "/" ); define('WP_USE_THEMES', false); require('./wp-blog-header.php'); $lessonnumber = $_REQUEST['f']; $type = $_REQUEST['t']; if ( $lessonnumber < '10' ) { $threedigitlesson = '00' . $lessonnumber; } elseif ( $lessonnumber < '100' ) { $threedigitlesson = '0' . $lessonnumber; } else { $threedigitlesson = $lessonnumber; } $filenamestart = "201-" . $threedigitlesson; $contenttype = 'application/octet-stream'; switch ($type) { case 'pdf': $extension = '.' . $type; $contenttype = 'application/pdf'; break; case 'doc': $extension = '.' . $type; $contenttype = 'application/msword'; break; default: $contenttype = ''; exit("It appears that you are trying to download a file that is not a lesson document. Please contact us if you believe this to be an error."); } $filename = $filenamestart . '.' . $type; $current_user = wp_get_current_user(); //$siteurl = site_url(); $pathroot = TLOJ_FSROOT; $download_path = $pathroot . "1hoefl4priaspoafr/"; if ( current_user_can("access_s2member_ccap_extendedlessons")) { $download_path = $download_path . "ex/"; } else { $download_path = $download_path . "st/"; } $file_path = $download_path . $filename; $tlojmemberlength = tlojunlocklessons(); if ( !is_user_logged_in() ) { exit("Please log in to access the file"); } if ( !current_user_can("access_s2member_ccap_downloadlessons") ) { exit("You don't have access to download the lessons!"); } if ( $lessonnumber > $tlojmemberlength ) { exit("It appears you are trying to jump ahead! While I am excited at your enthusiam, let's not rush our study time."); } if ( ($lessonnumber > '195') && (!current_user_can("access_s2member_ccap_lastweek")) ) { exit("Upgrade now to access the downloads for the five bonus lessons!"); } // build Final File Name $extendedmessage = ""; if ( current_user_can("access_s2member_ccap_extendedlessons")) { $extendedmessage = " - Extended"; } $myfinishedlessonname = "Lesson " . $lessonnumber . $extendedmessage . " -- The Life of Jesus Study" . "." . $type; // echo 'Download Path: ' . $download_path . '<br />'; // echo 'Source/Lesson Number: ' . $lessonnumber . '<br />'; // echo 'File Name: ' . $filename . '<br />'; // echo 'File Type: ' . $type . '<br />'; // echo 'Allowed Lessons: ' . $tlojmemberlength . '<br />'; // echo 'Final File Name: ' . $myfinishedlessonname . '<br />'; // echo 'File Path: ' . $file_path . '<br />'; // echo 'Content Type: ' . $contenttype . '<br />'; // echo 'File Size: ' . filesize($file_path) . '<br />'; if (headers_sent()) { exit("Sorry but the headers have already been sent."); } ob_end_clean(); if (file_exists($file_path)) { header('Content-Description: File Transfer'); header('Content-type: ' . $contenttype); header('Content-disposition: attachment; filename="' . $myfinishedlessonname . '"'); header('Content-Transfer-Encoding: binary'); header('Expires: 0'); header('Cache-Control: '); header('Pragma: '); header('Content-Length: ' . filesize($file_path)); flush(); ob_clean(); readfile($file_path); exit; } else { exit("No file present."); } ?>
Пожалуйста, помогите, поскольку я был в этом весь день, и я смущен до конца, почему это не сработает. Filesize () тянет правильную длину, поэтому я знаю, что на пути, на который я смотрю, есть файл. (Я также новичок в PHP, поэтому, если есть что-то, что мне не хватает, поделитесь им.)
Заранее спасибо!
Если это большой файл, он не может быть отправлен с readfile
. Попытайтесь использовать это:
$handle = fopen($file_path, 'rb'); $buffer = ''; while (!feof($handle)) { $buffer = fread($handle, 4096); echo $buffer; ob_flush(); flush(); } fclose($handle);
Я не уверен, почему это сработало, но я смог решить эту проблему, разбив файл php на две части. Piece 1 загружает WordPress и выполняет логическую проверку. Затем файл 1 передает информацию в файл 2 для выполнения логики загрузки и записывает информацию заголовка.
Как я уже сказал, я не уверен, почему это сработало, однако друг, который знает PHP лучше, чем я, сказал, что иногда, если сценарий занимает слишком много времени, чтобы обработать, заголовки не будут принимать. Возможно, WordPress слишком долго висел над сценарием для этих заголовков.
Надеюсь, это объяснение поможет кому-то другому, у кого есть эта трудность.
Если вы пытаетесь заставить браузер загружать файл с помощью
Content-Type: application/octet-stream Content-Disposition: attachment; filename="your-file.jpg"
но Chrome дает вам ERR_FILE_NOT_FOUND, а Firefox также терпит неудачу с «Не найден» (как ни странно, Opera работает) попробуйте добавить:
header('HTTP/1.0 200 OK', true, 200);
Хром говорил мне: «Ошибка 6 (net :: ERR_FILE_NOT_FOUND): Файл или каталог не найдены». И Firefox, заявив, что файл не существует.
Хотя тот же php-файл обрабатывал другой тип загрузки, у меня возникали проблемы с PNG и ICO, я пробовал некоторые методы, которые отображали только изображение, но не запрашивали окно загрузки.
Наконец, я узнал спасибо Crazycoolcam, что WordPress был проблемой. Я включил php в файл, который я назвал «tools.php», внутри tools.php он включил в основной файл заголовка WordPress, чтобы исправить проблему. Я разделил файл инструментов на WordPress версию и версию без WordPress и включил половину wordpress после того, как он написал файл.
Еще одна возможность здесь, почему он не работает. Это и послужило причиной для меня. Интересно, что file_exists возвращал true, но форма загрузки файла для публики для загрузки не работала без правильной установки ниже.
PHP имеет настройку open_basedir
Убедитесь, что это правильно настроено для вашей среды размещения. open_basedir можно редактировать через php.ini