Readfile возвращает пустой файл - PullRequest
0 голосов
/ 10 июля 2019

У меня есть этот код для принудительной загрузки, $file - это url существующего файла .jpg, .png или .pdf (я убедился, что он существует)

 <?php
    $file = $_REQUEST['file'];
    $file_extension = end(explode('.', $file));
    $file_name = end(explode('/', $file));
    switch ($file_extension) {
        case 'jpg':
            header('Content-Type: image/jpeg');
            header('Content-Disposition: attachment; filename='.$file_name);
            header('Pragma: no-cache');
            readfile($file);
            break;
        case 'png':
            header('Content-Type: image/png');
            header('Content-Disposition: attachment; filename='.$file_name);
            header('Pragma: no-cache');
            readfile($file);
            break;
        case 'pdf':
            header('Content-Type: application/pdf');
            header('Content-Disposition: attachment; filename='.$file_name);
            header('Pragma: no-cache');
            readfile($file);
            break;
    }

Но он загружает пустой (0 КБ) файл (с правильным именем)

Есть мысли о том, что может происходить?

Ответы [ 2 ]

1 голос
/ 10 июля 2019

Поскольку file_get_contents () также возвращает ноль, ваша проблема, вероятно, связана с настройкой в ​​конфигурации php.ini.

Параметр allow_url_fopen должен быть On .

0 голосов
/ 10 июля 2019

Это потому, что вам не хватает заголовка Content-Length.

Попробуйте это:

$file = $_REQUEST['file'];
$file_extension = end(explode('.', $file));
$file_name = end(explode('/', $file));

switch ($file_extension) {
    case 'jpg':
        header('Content-Type: image/jpeg');
        break;
    case 'png':
        header('Content-Type: image/png');
        header('Content-Disposition: attachment; filename='.$file_name);
        break;
    case 'pdf':
        header('Content-Type: application/pdf');
        break;
}

header('Content-Disposition: attachment; filename='.$file_name);
header('Pragma: no-cache');
header('Content-Length: ' . filesize($file));

// You may want to add this headers too (If you don't want the download to be resumable - I think).
header('Expires: 0');
header('Cache-Control: must-revalidate');

// And you may consider flushing the system's output buffer if implicit_flush is turned on in php.ini.
flush();

// If you have the file locally.
readfile($file);

// Otherwise,
echo file_get_contents($file); // You should have allow_url_include on in php.ini

Не пробовал, но должно работать.

...