1. PHP / Говнокод #5643

    +152

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    $mime_types = array('jad'  => 'text/vnd.sun.j2me.app-descriptor',
                            'jar'  => 'application/java-archive',
                            'txt'  => 'text/plain',
                            'sis'  => 'application/vnd.symbian.install',
                            'cab'  => 'application/vnd.ms-cab-compressed',
                            'zip'  => 'application/x-zip', 
                            'gz'   => 'application/x-gzip',
                            'tgz'  => 'application/x-gzip',
                            'bz'   => 'application/x-bzip', 
                            'bz2'  => 'application/x-bzip',
                            '7z'   => 'application/x-7z-compressed',
                            'rar'  => 'application/x-rar-compressed',
                            'doc'  => 'application/msword',
                            'pdf'  => 'application/pdf', 
                            'mp3'  => 'audio/mpeg', 
                            'wav'  => 'audio/x-wav',
                            'wma'  => 'audio/x-ms-wma',
                            'avi'  => 'video/x-msvideo',
                            '3gp'  => 'video/3gpp', 
                            'wmv'  => 'video/x-ms-wmv', 
                            'mpg'  => 'video/mpeg', 
                            'gif'  => 'image/gif', 
                            'jpg'  => 'image/jpeg',
                            'jpe'  => 'image/jpeg', 
                            'jpeg' => 'image/jpeg',
    	           );
    
    	$mime_type = (array_key_exist(pathinfo($filepath, PATHINFO_EXTENSION), $mime_types)) ? $mime_types[pathinfo($filepath, PATHINFO_EXTENSION)] : 'application/octet-stream';
    		
    	header('Content-Type: ' . $mime_type . ';');
                  header('content-disposition: attachment; filename="' . basename($filepath) . '";');
                  readfile($download);

    Использую сие для определения Content-Type перед отдачей файла для загрузки.
    И тут меня орашарашили тем, что прямо в лицо сказали, что сие - говнокод, а я - говнокодер всея Руси.
    Что такие дела делаются функциями и вообще что за говно, тут можно без массива.
    Неужто?

    Запостил: 7ion, 11 Февраля 2011

    Комментарии (27) RSS

    • В идеале тип файла нужно определять по его содержимому, а не по расширению. Для этого есть, к примеру, расширение fileinfo, включённое по умолчанию в PHP начиная с 5.3 (для более ранних версий его можно доустановить из PECL). Если же определять нужно непременно по расширению, то ваш вариант вполне себе рабочий, разве что для фапа расширяемости, если она требуется в данном случае, список типов файлов можно хранить в каком-нибудь конфиге, а не хардкодить.
      Ответить
      • В качестве конфига у меня инклудится файл с массивом. Для php самое то.
        Спасибо за наводку с fileinfo, не знал, сейчас почитаю маны.
        Ответить
    • http://www.govnokod.ru/5637 подобное и я гавнокодил, только у меня там ошибка смешная, а тут, смешного мало, единственное что если туда придёт скажем docx что я получу, ну если есть конфигурация ещё с разрешёнными типами.
      Ответить
    • Да, потому что, если рассматривать набор PHP файлов как программу... :) то логично было бы хранить настройки программы отдельно от самой програмы. Для описания данных, таких как те же настройки логичнее использовать форматы описания данных, ну, например, CSV, XML и им подобные. Делается так потому, что почти наверняка будет необходимость на каком-то этапе данные редактировать, а редакртировать исходники не логично, кроме того, нужна программа которая поможет это сделать (в блокноте / консоли - не удобно). Поэтому, скорее всего будете использовать какой-то редактор, который может эти настройки отобразить в удобном для пользователя формате, а он захочет их получить в каком-то определенном формате. Кроме того, форматы хранения данных лучше приспособлены для их хранения (компактнее / лучше гарантируют сохранность или целостность). В данном случае та же информация элементарно записаная в CSV заняла бы меньше места. (Хотя в целом загрузка файла настроек заняла бы больше времени). С дугой стороны гоняться за производительностью в скриптовом языке с изначально низкими показателями - уже само по себе странно. А удобство - оно никогда не помешает :)
      Ответить
      • Мне кажется построить ооп небольшое для проекта было бы само то в таком случае в обще, а не е**тся с ручной настройкой, проще написать уже программу которая будет сохранять и вадавать для нас удобном виде.
        Ответить
      • Вы правы, но дело в том, что это php :)
        Обычно я выношу подобные массивы в какой-нибудь файл, который юзер может исправить по мере надобности.
        Точно также выглядят файлы локализации.
        Думаю, все же и обычный юзер поймет, что такое 'title' => 'Заголовок' и как это править, да и блокнота ему как раз хватит.
        Подобного рода массивы для работы с php удобнее, чем xml и иже с ним.
        Пока php xml пропарсит, пока то, пока се...
        А юзер, думаю, если понимает формат xml, то и такую запись поймет.
        Ответить
        • Ну вот как пример, почему нет:
          используя XML можно оптимизировать, собрав похожие типы вместе. Кроме того, используя редактор (не блокнот), можно например, отсортировать по алфавиту, чтобы потом случайно не добавить несколько раз одно и то же. И почему это пользователь вообще должен понимать как устроен формат записи данных - он работает с программой (тот же Excel например), в нем ему все красиво расставлено в таблички, оформлено картинками и котики на фоне с радужной заливкой :)
          Другой момент - у программы может потом понадобиться веб-интерфейс для изменения настроек. Вы представляете, как это научить пользователя-владельца сайта найти нужный инклюд, сделать там изменения и т.п.? Обычно владелец сайта "ломается" на ssh уже, и дальше дело не идет :)
          Ответить
          • Ну не знаю, по-моему все же любой сможет, если дать ему название файла, открыть его блокнотом и поковырять по образу и подобию :)
            В конце концов, вы сейчас рассматриваете сферические случаи.
            А как вы думаете, если человек не умеет редактировать php-файл, то нужно ли ему будет что-то добавлять в этот массив? :)
            Такие массивы я просто выношу наверх functions.php, и если кому-то потребуется их поковырять - в readme написано, где это искать.
            Извращаться, приводить к стандартам и etc ради 3,5 товарищей? Если они знают, что такое mime-type, то и массив отредачить смогут :)
            telnet правильно отметил, что это скорее для фапа.
            И, да, в оригинале этот массив записан отсортированным по алфавиту. Так что вряд ли это нужно.
            А вот базы, допустим, смайликов, да - их я уже пишу в формате CVS.
            Ответить
            • Нет, абсолютно реальный жизненный случай - делался совсем простенький сайт-портфолио для "свадебного" фотографа. Ничего вообще необычного, но, тут решили что его видео файлы будут не flv, а mp4. Сервер по умолчанию такие файлы не разрешал ему даже загрузить. Впоследсвии оказалось, что нужны еще и mov, m4v и еще какие-то iTunes форматы, уже не помню какие. У сайта номинально была какая-то "админка", но разрешение / запрет на форматы файлов не был там реализован, в итоге лишняя головная боль, а мог вообще разработчиков и не найти. Научить заказчика, который, кроме всего прочего еще и не хочет, как это сделать "в коде" - как-то вообще не катит. Это все-таки задача разработчика дать пользователю удобный интерфейс контроля за програмой. На мой взгляд, изменение частей програмы - последнее дело в таком случае :)
              Еще такой момент - ну вот не сообразит пользователь где ставить запятые, или кавычки, или еще что-то в этом духе - и ведь не обязан. Поэтому редактор, который предоставит привычный интерфейс и приведет данный в вид удобоваримый для другой программы - гораздо предпочтительнее.
              Ответить
              • Тут уже дело мы имеем с массивной cms, где все уже будет храниться в sql-базе.
                Разумеется, тут необходимо было записать в таблицу разрешенные форматы и сделать интерфейс для добавления/удаления форматов.
                Вы меня переубедили :)
                Но все же, все должно быть в разумных передлах.
                Не стоит выводить в базу расширения, допустим, при создании простого файлохранилища, где сам скрипт ~100 строк.
                Необходимость использования баз формата CVS, либо SQL должно быть продиктовано размерами и назначением проекта, я считаю.
                Ответить
          • Если владелец обломается отредактировать .php, то и .csv отредактировать ему будет не проще. А если делать веб-интерфейс, то записать массив как php через var_export проще, чем в csv. Хотя лучше, имхо, использовать json -- ввод/вывод в одну строчку, и из других языков удобнее.
            Ответить
            • Откуда на клиенте возьмется var_export? JSON такой же легитимный формат, как и CSV, я не стану спорить о том, какой лучше - это уже решать по ситуации.
              И, не поверите, наша бухгалтер редактирует XML файлы в MS Excel (правда, она их всегда видит как таблицы, а не как текстовые файлы). И ничего так, получается... а вот исходники серверной части, (правда на Пайтоне), как-то ей даже в голову не приходит, да и доступа у нее туда нет... Более того, у нее даже XML файлы при двойном щелчке по ним мышкой отркываются в Excel, CSV - не пробовал, но, так подозреваю, что тоже открылся бы. :)
              Более того, вот те файлы, которые бухгалтер редактирует, они потом используются и клиентской частью и серверной, и никто не жалуется - всем удобно :)
              Ответить
              • На каком клиенте? В веб-админке? А она разве не на php?
                Ответить
                • Вам нужно представить данные на клиенте для редактрирования, и как-то послать их той же админке. Возможно, конечно, запустить php в терминале, и работать с ним через интерфейс командной строки, но я таких админок не видел.
                  Ответить
                  • Так клиент на сервере, доступ через браузер. Мы ведь о веб-интерфейсе?
                    Ответить
                    • Простите, что вы сейчас сказали?
                      Ответить
                      • Так клиент на сервере, доступ через браузер. Мы ведь о веб-интерфейсе?
                        Ответить
                        • кхм... [клиент - на клиенте, админка на сервере, коннект через веб-морду, 80 порт]
                          --
                          давайте, дальше...
                          Ответить
        • > Пока php xml пропарсит, пока то, пока се...

          Из одной этой строчки можно раздуть клёвый перформансосрач. Синтаксис PHP сложнее синтаксиса XML, поэтому XML парсится быстрее. Но PHP-код может быть закэширован каким-нибудь eAccelerator'ом и вообще парситься не будет. Но XML можно один раз распарсить и запихать в какой-нибудь APC. Но на хостинге APC может не быть. Да что там, и eAccelerator'а может не быть. А будет какой-нибудь Zend Optimizer, который работает быстрее. Нет, медленнее. Нет, быстрее. Давай напишем тест...

          *пора завязывать с любованием на %subj%осрачи, голова сама собой их просчитывать начинает*
          Ответить
    • pathinfo($filepath, PATHINFO_EXTENSION) в отдельную переменную, чтобы не копипастить, да и весь код лучше в отдельную функцию. Данные, конечно, лучше в отдельный файл, легче расширять. Говна не вижу.
      Ответить
    • Код правильный, сам так пишу. Нечего функций плудонить, где их не нужно.
      Ответить
    • кровавая гебня запретила mime_content_type()?
      Ответить
      • Представьте себе да. Ее нет в стандартной сборке и сервера и работает она только под апачем, коли не ошибаюсь.
        И, алсо, она deprecated.
        Ответить
        • > работает она только под апачем
          высокие мысли о переносимости это, конечно, хорошо. но рано, т.к. пока умеем только суффиксы хардкодить

          у апача можно спросить о файле подзапросом, если в PHP не посчитали это ненужной фичей
          Ответить

    Добавить комментарий