Форум программистов, компьютерный форум, киберфорум
Наши страницы
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
unit37
3 / 3 / 1
Регистрация: 25.12.2014
Сообщений: 63
1

PHP: файл отдается при скачивании повреждённым

26.10.2016, 20:34. Просмотров 453. Ответов 7
Метки нет (Все метки)

Доброго вечера, форумчане!
Скрипт скачивания файла представлен ниже.

Файл всегда приходит повреждённым. По полному пути к файлу он обнаруживается, считывается размер файла.
В браузере Mozilla Firefox получаю окно ошибки поверх запроса на сохранение (скриншот - во вложениях), после закрытия которого при нажатии на кнопку "сохранить" форма сохранения не появится.

В Chrome будто бы всё скачивается, но в итоге при попытке открыть файл получаю ошибку, связанную с повреждённостью файла. Файлы на сервере не повреждены, что легко проверяется скачиванием через FTP-клиент.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 if (isset($_GET['id'])) {
//получение пути файла по id из БД: работает
  $mysqli_file = mysqli_query($mysqli,"SELECT * FROM files WHERE id = '$_GET[id]' LIMIT 1");
  if(mysqli_num_rows($mysqli_file) == 0) { echo "Файл не найден."; exit(); }
  else $file = mysqli_fetch_assoc($mysqli_file);
 
 
  $filename = getcwd().$file['name'];
 
  if(file_exists(getcwd().$file['path']))
  {
    //echo 'File exists: '.getcwd().$file['path']; - если раскомментить - отрабатывает, т.е. file_exists возвр. true
    $extension = strtolower(substr(strrchr($file['path'],"."),1));
    switch ($extension) {
      case "txt": $ctype="text/plain"; break;
      case "pdf": $ctype="application/pdf"; break;
      case "doc": $ctype="application/msword"; break;
      case "docx": $ctype="application/msword"; break;
      case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
      case "pptx": $ctype="application/vnd.ms-powerpoint"; break;
      case "gif": $ctype="image/gif"; break;
      case "png": $ctype="image/png"; break;
      case "jpeg": $ctype="image/jpg"; break;
      case "jpg": $ctype="image/jpg"; break;
      default: $ctype="application/force-download";
    }
    $size = filesize(getcwd().$file['path']);
    $file_name = $file['path'];
    header("Content-Type: $ctype");
    header("Content-Disposition: attachment; filename=\"".$file['name']."\";" );
    header("Content-Length: ".$size);//заголовок приходит
    readfile("$file_name");
  }
  //else echo 'File does not exists: '.getcwd().$file['path'];
  exit();
} else {
  echo "Файл не найден.";
  exit();
}
Помогите советом, в чем может быть дело. Чувствую, в какой-то незаметной для меня ерунде...
0
Миниатюры
PHP: файл отдается при скачивании повреждённым  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2016, 20:34
Ответы с готовыми решениями:

Php!? при закрытии окна выполнить файл del.php!?
Как отловить закрытие окна, при его закрытии должен выполниться некий файл...

Переименовывание при скачивании файлов
Заливаю через html-форму файлы на сайт, формат например *.apk(приложения для...

ошибка при скачивании word файла
привет всем. Скачиваю файл(docx) вот таким скриптом <?php ob_start(); ...

Дополнительные параметры при скачивании файла
Гуру, подскажите, можно ли передать ТЕОРЕТИЧЕСКИ дополнительные реквизиты с...

Архивация при скачивании файлов пользователем
Суть проблемы такова - при нажатии пользователем на ссылку происходит...

7
Пифагор
Модератор
1218 / 1008 / 529
Регистрация: 10.01.2015
Сообщений: 3,394
27.10.2016, 01:58 2
unit37, сразу в строке 3 синтаксическая ошибка.
$_GET[id] id возьмите в кавычки и $_GET['id'] возьмите в фигурные скобки.
А лучше просто присвойте
PHP
1
$id = $_GET['id'];
Не числовые ключи должны быть заключены в кавычки.
Неужели PHP ошибку не выдал? Вы, наверное, выключили вывод ошибок.
0
Jewbacabra
Эксперт PHP
3571 / 2965 / 1319
Регистрация: 24.04.2014
Сообщений: 9,009
27.10.2016, 02:06 3
Цитата Сообщение от Пифагор Посмотреть сообщение
сразу в строке 3 синтаксическая ошибка.
нет.
PHP
1
2
3
"{$_GET['id']}"
"${_GET['id']}"
"$_GET[id]"
но не
PHP
1
"$_GET['id']"
В этой строке есть инъекция, что гораздо хуже синтаксической ошибки
0
Пифагор
Модератор
1218 / 1008 / 529
Регистрация: 10.01.2015
Сообщений: 3,394
27.10.2016, 02:12 4
Jewbacabra, уточните, где я говорю о
PHP
1
"$_GET['id']"
?

Добавлено через 1 минуту
Цитата Сообщение от Jewbacabra Посмотреть сообщение
нет.
$_GET[id], по-Вашему, не ошибка???
Как минимум, должен быть нотис Use of undefined constant id
0
Jewbacabra
Эксперт PHP
3571 / 2965 / 1319
Регистрация: 24.04.2014
Сообщений: 9,009
27.10.2016, 02:19 5
Цитата Сообщение от Пифагор Посмотреть сообщение
$_GET[id], по-Вашему, не ошибка синтаксиса???
Как минимум, должен быть нотис Use of undefined constant id
http://ideone.com/GSSoOy
http://ideone.com/Zx4kkZ
0
Пифагор
Модератор
1218 / 1008 / 529
Регистрация: 10.01.2015
Сообщений: 3,394
27.10.2016, 02:26 6
Как вариант, НО...
Не числовые ключи должны быть заключены в кавычки.
http://sandbox.onlinephpfunctions.co...584f479bc3ed39

А то скоро как в Питоне будет не обязательно ; ставить в конце строки...
0
Jewbacabra
Эксперт PHP
3571 / 2965 / 1319
Регистрация: 24.04.2014
Сообщений: 9,009
27.10.2016, 02:39 7
Пифагор, Все это относится к подстановке переменной в строку с двойными кавычками

Добавлено через 4 минуты
unit37,
PHP
1
2
3
4
5
6
7
8
<?php
$file = '/full/path/to/file'; // полный путь к файлу, который не загружается
$size = filesize($file);
$type = 'application/pdf'; // mime type файла
header("Content-Type: $type");
//header('Content-Disposition: attachment; filename="'. basename($file) .'";');
header("Content-Length: $size");
readfile($file);
что такой скрипт выведет
0
полудух
155 / 168 / 46
Регистрация: 15.03.2016
Сообщений: 1,061
27.10.2016, 03:42 8
создатели сами рекомендуют всегда кавычки юзать в массиве, иначе id могут принять за константу
внутри двойных кавычек кстати не знаю, потому что сам никогда не кладу туда переменные, а делаю конкатенацию
0
27.10.2016, 03:42
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2016, 03:42

При скачивании файла вернуть ему оригинальное имя
При загрузке файла на сервер он получает имя типа...

Установка тегов для файлов *.mp3 на лету (при скачивании)
Здравствуйте. Вот такой вопрос. У меня на сайте находятся файлы *.mp3. Можно...

При входе на localhost скачивается файл index.php
При входе через браузер Google Chrome на localhost скачивается файл index.php...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru