PHP Readfile () не работает для меня, и я не знаю почему - PullRequest
1 голос
/ 07 ноября 2011

Я пытаюсь заставить этот код работать, но по какой-то причине все эхо-сигналы способны выводить правильное содержимое, но заголовки не хотят принудительно загружать мой документ. Далее следует файл, который я пытаюсь создать для загрузки файлов. Он настроен на ввод кода следующим образом: 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, поэтому, если мне чего-то не хватает, поделитесь.)

Заранее спасибо!

Ответы [ 5 ]

8 голосов
/ 07 ноября 2011

Если это большой файл, его нельзя отправить с readfile.Попробуйте использовать это:

  $handle = fopen($file_path, 'rb'); 
  $buffer = ''; 
  while (!feof($handle)) { 
    $buffer = fread($handle, 4096); 
    echo $buffer; 
    ob_flush(); 
    flush(); 
  } 
  fclose($handle); 
3 голосов
/ 09 ноября 2011

Я не уверен, почему это сработало, но я смог решить эту проблему, разбив свой php-файл на две части.Часть 1 загружает WordPress и выполняет проверку логики.Затем файл 1 передает информацию в файл 2 для выполнения логики загрузки и записи информации заголовка.

Как я уже сказал, я не уверен, почему это сработало, однако друг, который знает PHP лучше, чем я, сказалиногда, если сценарий обрабатывается слишком долго, заголовки не берутся.Вполне возможно, что WordPress слишком долго вешал скрипт для этих заголовков.

Надеюсь, это объяснение поможет кому-то еще, кто испытывает эту трудность.

2 голосов
/ 31 июля 2013

Если вы пытаетесь заставить браузер загрузить файл с использованием

Content-Type: application/octet-stream
Content-Disposition: attachment; filename="your-file.jpg"

, но Chrome дает вам ERR_FILE_NOT_FOUND , и Firefox также завершается ошибкой с "Not found" (странно, что Opera работает), попробуйте добавить:

header('HTTP/1.0 200 OK', true, 200);

0 голосов
/ 11 октября 2013

Просто еще одна возможность, почему он не работает.Это было причиной для меня.Интересно, что file_exists возвращал значение true, но ни одна форма предоставления файла для загрузки не работала без правильной установки приведенного ниже.

В PHP есть параметр с именем open_basedir

Убедитесь, что это правильно настроено в соответствии с вашей хостинговой средой.open_basedir можно редактировать через php.ini

0 голосов
/ 12 сентября 2012

Chrome говорил мне: «Ошибка 6 (net :: ERR_FILE_NOT_FOUND): файл или каталог не найден». А в Firefox говорят, что файл не существует.

Хотя тот же php-файл обрабатывал загрузку другого типа, у меня были проблемы с PNG и ICO, я попробовал некоторые методы, которые отображали только изображение, но не отображали окно для загрузки.

Наконец-то, благодаря Crazycoolcam, я узнал, что проблема в Wordpress. Я включил php в файл, который я назвал "tools.php", внутри tools.php в него был включен основной заголовочный файл wordpress, Чтобы устранить проблему, я разделил файл инструментов на версию WordPress и версию без WordPress и включил половину WordPress после того, как файл был выписан.

...