Скачать файл поврежден.Тип контента не работает? - PullRequest
5 голосов
/ 09 мая 2011

Я хочу разрешить пользователю загружать файл PDF, код загрузки приведен ниже .... по какой-то странной причине, даже если файл загружается, я получаю сообщение об ошибке, говорящее о том, что файл был поврежден на сервере.... Может кто-нибудь помочь мне и указать, где я совершаю свою ошибку.

<php

$name = $_POST["name_first"];

    $mail = $_POST['email'];


    $number = $_POST['phone_number'];

            $email_message = "first name: {$name} email is {$mail} number is {$number} ";
            mail('fanaa@gmail.com', 'Form Response', $email_message);

                if ($mail == "" OR $name == "" OR $number == "")
                    {
                        echo "Enter valid details  ";

                    }
                    else
                    {
                        header('Content-type: application/pdf');
                        header('Content-Disposition: attachment; filename="tokina.pdf"');
                        readfile('docs/tokina.pdf');

                    }
?>

Ответы [ 8 ]

13 голосов
/ 09 мая 2011

Я использовал этот код для загрузки файлов в формате pdf:

header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");
    header('Content-Type: application/octetstream');
    header("Content-Transfer-Encoding: Binary");
    header("Content-length: ".filesize($file));
    header("Content-disposition: attachment; filename=\"".basename($filename)."\"");
    readfile("$file");                
  }

Все должно быть в порядке, и убедитесь, что нет пробелов или возвращаемых символов (вообще не используйте php - лучшее решение).

Если у вас все еще есть проблемы, откройте поврежденный файл с помощью блокнота (возможно, внутри есть предупреждение об ошибке php).

Надеюсь, это поможет!

3 голосов
/ 09 мая 2011

Удалите заголовки и посмотрите на страницу, вы видите какие-либо сообщения об ошибках?Если PHP выводит что-то кроме фактического источника PDF, файл будет поврежден.

1 голос
/ 03 апреля 2012
header('Content-type: application/pdf');

включите расширение PHP php_gettext и все готово.

0 голосов
/ 26 марта 2017

Я использую

$download_path = your path (where to look for the files)
set_time_limit(0);
$file_url = $download_path . $data['link'];
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="' . basename($file_url). '"');
//then to read the file
readfile($file_url);

это обычно работает для меня

0 голосов
/ 04 мая 2014

Используя этот скрипт

   header('Content-Type: application/force-download');
   header('Content-Disposition: attachment; filename='.$filename);
   header('Content-Transfer-Encoding: binary');
   header('Content-Length: '.filesize($filenamepath));

   readfile($filenamepath);

У меня была такая же проблема. Сравнивая исходный файл и загруженный файл с помощью шестнадцатеричного редактора, такого как UltraEdit, я обнаружил некоторые символы в начале поврежденного файла.

Проблема заключалась в том, что после ?> разметки конца кода PHP в моем коде несколько раз заканчивались строки.

Удалите все разделители строк после ?> и прочитайте также статью на форуме Загруженные файлы повреждены - общая проблема . Это сработало для меня.

Надеюсь, это поможет вам.

0 голосов
/ 09 мая 2011

Ваш файл PDF tokina.pdf либо не загружен, либо не находится в том же каталоге, что и файл PHP.Вот почему он сохраняется как «tokina.pdf.htm» - вместо этого он загружает HTML-код для страницы 404.Вот почему ваш браузер / программа просмотра PDF считает, что файл «поврежден» - потому что его расширение - PDF, а его содержимое - нет.

Убедитесь, что файл загружен, и если это так, убедитесь, что readfileуказывает на правильный путь.Если он не находится в той же папке, используйте относительный / абсолютный путь, например:

readfile('docs/tokina.pdf');

И да, тип содержимого должен быть application/pdf

0 голосов
/ 09 мая 2011

Возможно, ваш тип контента неправильный.попробуйте это:

header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="downloaded.pdf"');
readfile('original.pdf');
0 голосов
/ 09 мая 2011

попробуйте убрать двойные кавычки в

header('Content-type: "application/octet-stream"');

, чтобы оно стало

header('Content-type: application/octet-stream');
...