Принудительно скачать файл с PHP, давая пустой файл - PullRequest
1 голос
/ 25 августа 2010

Конечная цель - загрузить файл .csv. Сейчас я просто пытаюсь загрузить простой текстовый файл: test.txt. Единственное, что есть в этом файле - это слово «тест».

Вот HTML-код для files_to_download.php

Test file: <a href='test.php?file=test.txt'>Test.txt</a>

Код для test.php:

if(!(empty($_GET["file"])))
{
    $file_name = $_GET["file"];
    $path = "path/to/file";
    $fullPath = $path . $file_name;

    if(ini_get('zlib.output_compression'))
      ini_set('zlib.output_compression', 'Off');

    header("Cache-Control: public");
    header("Content-Description: File Transfer");
    header("Content-Disposition: inline; attachment; filename=\"$file_name\"");
    header("Content-Type: text/plain");
    header("Content-Transfer-Encoding: binary");
    readfile($fullPath);
}

Я пробовал варианты заголовков выше, добавляя больше и удаляя другие. Вышеуказанное является наиболее распространенной рекомендацией на этом сайте.

Я также пытался изменить

header("Content-Type: text/plain");

до

header("Content-Type: text/csv");

и получите те же результаты: пустой файл .txt или .csv.

Файлы не пустые, когда я открываю их напрямую (браузер файлов) с сервера. Я проверил права доступа к файлам, и они оба 644, так что весь мир может хотя бы прочитать файлы. Каталог 777.

Есть ли на сервере Apache конфигурация, которую мне нужно указать, которая может отсутствовать или я что-то упустил выше?

Спасибо за внимание!

Ответы [ 4 ]

7 голосов
/ 25 августа 2010

В большинстве случаев путь неправильный

1 голос
/ 01 ноября 2014

В моем случае путь был правильный. И форсирование загрузки работало на Windows, но не на Mac.

После нескольких тестов я выяснил, что заголовок Content-Length не работает. Я использовал функцию fileize для полного URL, например:

$url_my_file = "http://my-website.com/folders/file.ext";
header('Content-Length: '.(filesize($url_my_file)));

Я заменяю его на

$url_my_file = "http://my-website.com/folders/file.ext";    
$headers  = get_headers($url_my_file, 1);
header('Content-Length: '.($headers['Content-Length']));

И ... сейчас работает:)

1 голос
/ 25 августа 2010

Прочитайте текстовый файл, затем echo текст после вызова header ().

Вот как у меня настроена загрузка csv:

//downloads an export of the user DB
$csv = User::exportUsers();

header('Content-disposition: attachment; filename=userdb.csv');
header('Content-type: text/csv');

echo $csv;

Где exportUsers() создает данные CSV. Вы можете легко заменить $ csv содержимым вашего текстового файла, а затем отобразить его.

А что касается вашего текстового файла, вы можете использовать file_get_contents(), чтобы получить содержимое вашего файла в строку. Затем повторить эту строку.

0 голосов
/ 25 августа 2010

Попробуйте установить длину содержимого файла:

header('Content-Length: ' . filesize($file));

Также имейте это в виду: включение файла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...