Приемы :: Планета Excel

Сортировка: дата создания дата изменения просмотры комментарии

5 примеров использования новой функции IMAGE в Excel

Разбираем на примерах варианты использования новой функции ИЗОБРАЖЕНИЕ (IMAGE) для вставки изображений по ссылкам на лист Excel + делаем собственный аналог на VBA для вставки изображений из локальных файлов.

Подробнее…

ChatGPT и Excel

Примеры использования искусственного интеллекта Open AI ChatGPT для решения повседневных задач в Microsoft Excel: ввод формул, создание макросов и М-функций в Power Query.

Поиск отличий в 2 текстовых строках

Как сравнить 2 текстовых строки и найти отличия (даже если визуально они, вроде бы, совпадают).

Диаграмма выполнения плана

Ещё один наглядный вариант визуализации выполнения плана с помощью столбчатой гистограммы с накоплением и «усов» погрешностей в Microsoft Excel.

Решение системы уравнений в Excel

Как решить систему уравнений (линейных и нелинейных) в Microsoft Excel с помощью обратной матрицы Крамера и подбором в надстройке Поиск решения (Solver).

Регистро НЕ чувствительность в Power Query (и Power BI)

Как победить регистрочувствительность в Power Query при фильтрации, удалении дубликатов и объединении таблиц с помощью функции Comparer.OrdinalIgnoreCase

Склейка диапазонов новыми функциями VSTACK и HSTACK

Как склеить (друг под другом или друг рядом с другом) несколько таблиц (в том числе с нескольких листов) с помощью новых функций Office 365 — ВСТОЛБИК (VSTACK) и ГСТОЛБИК (HSTACK).

Динамический «Топ-N + Другие» в сводной таблице

Как при помощи запроса Power Query реализовать в сводной таблице вывод динамического «Топ-N + Другие».

Быстрое прогнозирование в Microsoft Excel

Как при помощи Листа Прогноза за пару минут сформировать по историческим данным прогноз на будущее по методу экспоненциального сглаживания.

Путь к текущей книге и новая функция LET

Как с помощью формул получить в ячейке листа обновляемый путь к текущей книге.

Подробнее…

Риск безопасности и блокировка макросов

Как разблокировать макросы при появлении сообщения РИСК БЕЗОПАСНОСТИ, когда файл была скачана из интернета.

Слушаем интернет-радио в Excel

Как за пару минут реализовать в Excel прослушивание интернет-радиостанций с помощью внедренного компонента Windows Media Player и макроса в две строки.

Горизонтальная фильтрация столбцов в Excel

Три способа реализовать горизонтальную фильтрацию столбцов, которая изначально отсутствует в Microsoft Excel: с помощью функции ФИЛЬТР, запроса Power Query + сводная таблица и макросом на VBA.

Переключение вычислений в сводной таблице срезами

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

Копировать сумму выделенных ячеек в Буфер обмена

Как быстро скопировать в Буфер сумму выделенных на листе ячеек. А также не только сумму (среднее, количество и т.д.) и не только выделенных (только видимых, удовлетворяющих заданным условиям и т.д.)

Как правильно разворачивать вложенные таблицы в Power Query

Как избежать проблем при разворачивании вложенных таблиц в Power Query, если в исходных данных добавляются или удаляются столбцы.

Моделирование лотереи в Excel

Считаем вероятность выигрыша в лотерею, частоты выпадения шаров и моделируем игру по различным стратегиям с помощью макроса.

Столбец из примеров — искуственный интеллект в Power Query

Подробный разбор инструмента Столбец из примеров (Column from Examples), автоматически подбирающего формулу для преобразования ваших данных по заданному образцу.

Диаграмма по выделенной ячейке

Как построить диаграмму, где будут отображаться данные из той строки, где сейчас стоит активная ячейка.

Сборка разноформатных таблиц с одного листа в Power Query

Как собрать несколько разноформатных простых (не умных!) таблиц с одного листа Excel, а затем развернуть их в плоские (нормализовать) и соединить в единое целое с помощью Power Query.

Подробнее…

Нарастающий итог в Excel

Что такое нарастающие итоги (Running Totals) и как вычислить в Microsoft Excel разными способами: формулами, в сводной таблице, в запросе Power Query.

LAMBDA — новая суперфункция Excel

Подробный разбор с примерами новой функции LAMBDA, позволяющей создавать свои собственные функции в Microsoft Excel (включая реализацию даже рекурсивных вычислений).

Сохранение истории обновлений запросов Power Query

Как при обновлении запросов Power Query сохранять старые значения для истории, а не заменять их на новые.

Деление слипшегося текста функцией ФИЛЬТР.XML

Быстрый способ разделить слипшиеся данные на несколько ячеек с помощью функции ФИЛЬТР.XML, превратив исходный текст в XML-код.

Обновляемый курс валют в Excel

Как использовать функции ВЕБСЛУЖБА (WEBSERVICE) и ФИЛЬТР.XML (FILTERXML) для загрузки мгновенно обновляемого курса любой валюты на любой интервал дат.

Система учета заказов на Google Calendar и Excel

Как вести учет заказов в Google-календаре и загружать потом оттуда данные в Excel с обновлением через Power Query.

Динамические гиперссылки между таблицами

Как сделать удобные динамические гиперссылки, чтобы быстро переходить из одной таблицы в другую — к заданному значению в строке и столбце. Что-то типа ВПР, но возвращающая ссылку, а не значение.

Поиск ключевых слов в тексте

Как быстро найти в исходном тексте все ключевые слова из справочника и вывести их рядом с каждой ячейкой данных через заданный символ-разделитель. Попутно разбираемся с буферизацией запросов в Power Query с помощью функции Table.Buffer для ускорения обработки.

Сборка таблиц с разными шапками из нескольких книг

Как при помощи Power Query собрать данные из всех файлов заданной папки, если заголовки столбцов в них отличаются.

Разделение таблицы по листам

Как разобрать данные из одной таблицы сразу на несколько листов по заданному критерию. Разбираем два способа — с обновлением (через Power Query) и без (только VBA).

Одновременная фильтрация нескольких сводных таблиц

Как фильтровать сразу несколько сводных таблиц в дашборде с помощью общего среза. Разбор 2 способов для сводных, построенных по одному и по разным источникам данных.

Картинки как подписи на диаграмме

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

Преимущества сводной по Модели Данных

Как и зачем строить сводную в Excel по Модели Данных (Data Model) и какие преимущества это даёт по сравнению с классической сводной таблицей?

Поиск последнего вхождения (инвертированный ВПР)

Все стандартные функции поиска (ВПР, ГПР, ПОИСКПОЗ и т.д.) ищут только сверху-вниз и слева-направо. Что же делать, если нужно реализовать обратный поиск совпадений, т.е. искать не первое, а последнее вхождение требуемого значения в списке?

Парсинг нетабличных данных с сайтов

Импорт нетабличных данных, которые обычно «не видит» Power Query, на примере парсинга цен и товаров с сайта Wildberries.

Распределяем список по наборам

Как разделить список по наборам неодинакового размера — разбор 3 способов: вручную через сводную, запросом в Power Query и функциями динамических массивов.

Сводная по таблице с многострочной шапкой

Как построить сводную таблицу по исходным данным с многострочной шапкой, преобразовав их в нормальный вид с помощью надстройки Power Query.

Выпадающий список с показом изображений

Как сделать в Excel 2013 и новее выпадающий список, при выборе из которого рядом будет появляться изображение выбранного объекта (товара, человека и т.д.)

Как правильно использовать стили в Excel

Зачем (на самом деле!) нужны Стили в Excel и как правильно их использовать для быстрого форматирования ваших данных.

Исправление чисел, превратившихся в даты

Три способа исправить числа, случайно превратившиеся в даты в Microsoft Excel.

Вафельная диаграмма в Excel

2 способа построить в Excel вафельную диаграмму (waffle-chart) для наглядной визуализации прогресса по проекту или любых других KPI.

Массовая замена текста в Power Query функцией List.Accumulate

Как заменить множество одних фрагментов текста на другие по справочнику в Power Query с помощью хитрой функции List. Accumulate.

Массовая замена текста формулами

Как с помощью формулы произвести массовую замену одного текста (или его фрагмента) на другой по имеющейся таблице подстановок (справочнику).

Регулярные выражения (RegExp) в Power Query

Как добавить поддержку регулярных выражений (RegExp) в Power Query для реализации поиска и извлечения фрагментов текста по гибким шаблонам и маскам.

Производственный календарь в Excel

Как при помощи Power Query сделать в Excel «вечный» производственный календарь — автоматически обновляющийся список нерабочих дней за все годы для использования в своих расчетах.

Обманчивая простота функции ПОСЛЕД (SEQUENCE)

Разбор на примерах возможностей новой функции ПОСЛЕД (SEQUENCE) — генератора числовых последовательностей из последнего обновления Office 365 с динамическими массивами.

Импорт данных из OneDrive и SharePoint в Power Query / BI

Как загрузить отдельные файлы или содержимое целой папки из облака OneDrive или SharePoint в модель данных Power BI или в Excel через Power Query.

ВПР и числа-как-текст

Как научить функцию ВПР (VLOOKUP) искать значения, когда в исходных данных встречаются «числа-как-текст», что приводит к ошибкам #Н/Д.

План-факт анализ в сводной таблице с Power Pivot и Power Query

Пошаговый разбор решения задачи план-факт анализа с использованием сводных таблиц, модели данных Power Pivot со связями «многие-ко-многим», простых мер на DAX и допиливании входных данных с помощью Power Query.

Ад Условного Форматирования

Что такое «Ад Условного Форматирования», когда и почему он возникает? Как с ним бороться вручную и при помощи специального макроса?


du получить отсортированный по размеру список папок и файлов / i-notes.org

Если вы достаточно часто пользуетесь системой Linux, вы уже должны быть знакомы с командой du. Команда du позволяет проверить или вывести в консоли использование пространства на диске. С ее помощью можно посмотреть текущее использование диска для набора файлов и папок.

Возможность получить список папок, отсортированный по размеру, может быть полезна, когда вы пытаетесь найти файлы или папки, которые занимают больше всего места на диске. Однако команда или утилита du не имеет возможности сортировки по размеру.

Один из вариантов — направить вывод через утилиту sort. sort — это универсальная утилита, которая может использоваться во многих различных сценариях для сортировки текста или чисел. Возможно, это также один из общих методов, который можно использовать для сортировки практически любого командного вывода в Linux.

По умолчанию du выводит значения в kb или килобайтах. Поэтому, чтобы отсортировать файлы и папки по размеру, вы можете использовать следующую команду

du /path-folder | sort -n

Опция командной строки -n или -numeric-sort указывает, что сортируемые значения являются целыми числами и должны быть отсортированы численно. Вы можете использовать опцию -r или -reverse для сортировки в обратном порядке.

Очевидно, что это будет работать до тех пор, пока размер выводится в виде числа, что и происходит, если вы не используете никаких аргументов командной строки для изменения отображаемого размера. Это также работает с опцией -b или -bytes. Но иногда требуется вывести размер в удобочитаемом формате. Для этого можно использовать опцию -h или -human-readable в du.

du -hs /path-folder

Когда вы распечатываете вывод du в человекочитаемом формате, команда sort будет работать некорректно. Если вы используете одну из последних версий sort, то вы можете использовать опцию -h или -human-numeric-sort команды sort для сортировки входных данных.

du -hs * | sort -h

сортировка вывода du в linux

Пакет GNU coreutils, поддерживающий эту опцию, был выпущен некоторое время назад в 2009 году (версия 7.5), поэтому вполне вероятно, что у вас уже есть по крайней мере эта версия или вы можете обновить свои пакеты. Если по какой-то причине у вас более старый пакет, то вам придется использовать некоторые сценарии linux для достижения того же результата.

Существует несколько различных способов сделать это, и большинство из них включают либо двойной подсчет, либо выполнение команды du дважды. Ни один из них не является оптимальным или эффективным. Один из самых простых способов сортировки без опции -h в sort — это сначала использовать команду du без опции -h, отсортировать вывод, а затем снова запустить du на отсортированном списке папок.

du -b * | sort -n | cut -f2-

В приведенном выше примере du выводит размер в байтах, после чего он сортируется по порядку. Последняя часть использует утилиту cut для печати только имени папки или файла, отсортированного по размеру. Теперь мы можем снова передать этот вывод в du с опцией -h, чтобы распечатать размер в человекочитаемом виде.

du -h $(du -b * | sort -n | cut -f2-)

вывод du, отсортированный с помощью sort в linux

Вышеприведенный способ должен вывести размеры файлов и папок в удобочитаемом формате, отсортированные по размеру.

Структура каталогов — Laravel — PHP Framework для веб-мастеров

Версия

Master10.x9. x8.x7.x6.x5.85.75.65.55.45.35.25.15.04.2

  • Введение
  • Корневой каталог
    • Приложение Каталог
    • Начальный каталог
    • Каталог конфигурации
    • База данных Каталог
    • Общедоступный каталог
    • ресурсов Каталог
    • Каталог маршрутов
    • Каталог хранилища
    • Каталог тестов
    • Справочник поставщиков
  • Каталог приложений
    • Справочник вещания
    • Каталог консоли
    • Каталог событий
    • Каталог исключений
    • Каталог Http
    • Каталог вакансий
    • Каталог слушателей
    • Каталог Mail
    • Каталог моделей
    • Каталог уведомлений
    • Каталог политик
    • Справочник поставщиков
    • Справочник правил

Введение

Структура приложения Laravel по умолчанию предназначена для обеспечения отличной отправной точки как для больших, так и для малых приложений. Но вы можете организовать свое приложение так, как вам нравится. Laravel почти не накладывает ограничений на то, где находится тот или иной класс, пока Composer может автоматически загружать класс.

Примечание Новичок в Laravel? Посетите Laravel Bootcamp для практического ознакомления с фреймворком, пока мы познакомим вас с созданием вашего первого приложения Laravel.

Корневой каталог

Каталог приложений

Каталог приложения содержит основной код вашего приложения. Вскоре мы рассмотрим этот каталог более подробно; однако почти все классы вашего приложения будут находиться в этом каталоге.

Каталог Bootstrap

Каталог bootstrap содержит файл app.php , который загружает фреймворк. В этом каталоге также находится каталог кэша , который содержит созданные фреймворком файлы для оптимизации производительности, такие как файлы кэша маршрутов и служб. Обычно вам не нужно изменять какие-либо файлы в этом каталоге.

Каталог конфигурации

Каталог config , как следует из названия, содержит все файлы конфигурации вашего приложения. Это отличная идея, чтобы прочитать все эти файлы и ознакомиться со всеми доступными вам вариантами.

Каталог базы данных

Каталог базы данных содержит ваши миграции баз данных, фабрики моделей и исходные данные. При желании вы также можете использовать этот каталог для хранения базы данных SQLite.

Общий каталог

Общедоступный каталог содержит файл index.php , который является точкой входа для всех запросов, поступающих в ваше приложение, и настраивает автозагрузку. В этом каталоге также хранятся ваши активы, такие как изображения, JavaScript и CSS.

Каталог ресурсов

Каталог ресурсов содержит ваши представления, а также необработанные, нескомпилированные активы, такие как CSS или JavaScript.

Каталог маршрутов

Каталог route содержит все определения маршрутов для вашего приложения. По умолчанию в Laravel включены несколько файлов маршрутов: web.php , api.php , console.php и channels.php .

Файл web.php содержит маршруты, которые RouteServiceProvider помещает в группу промежуточного программного обеспечения web , которая обеспечивает состояние сеанса, защиту CSRF и шифрование файлов cookie. Если ваше приложение не предлагает RESTful API без сохранения состояния, то все ваши маршруты, скорее всего, будут определены в файл web.php .

Файл api.php содержит маршруты, которые RouteServiceProvider помещает в группу промежуточного программного обеспечения api . Эти маршруты предназначены для сохранения состояния, поэтому запросы, поступающие в приложение через эти маршруты, предназначены для аутентификации с помощью токенов и не будут иметь доступа к состоянию сеанса.

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

В файле channels.php вы можете зарегистрировать все каналы трансляции событий, которые поддерживает ваше приложение.

Каталог хранилища

Каталог хранилища содержит ваши журналы, скомпилированные шаблоны Blade, сеансы на основе файлов, кэши файлов и другие файлы, созданные платформой. Этот каталог разделен на каталоги app , framework и logs . Каталог app может использоваться для хранения любых файлов, созданных вашим приложением. 9Каталог 0012 framework используется для хранения файлов и кешей, сгенерированных фреймворком. Наконец, каталог logs содержит файлы журналов вашего приложения.

Каталог storage/app/public может использоваться для хранения файлов, созданных пользователями, таких как аватары профилей, которые должны быть общедоступными. Вы должны создать символическую ссылку по адресу public/storage , которая указывает на этот каталог. Вы можете создать ссылку с помощью команды php artisan storage:link Artisan.

Каталог тестов

Каталог тестов содержит ваши автоматические тесты. Примеры модульных тестов PHPUnit и функциональных тестов предоставляются из коробки. Каждый класс испытаний должен иметь суффикс слова Test . Вы можете запустить свои тесты, используя команды phpunit или php vendor/bin/phpunit . Или, если вы хотите более подробное и красивое представление результатов вашего теста, вы можете запустить свои тесты, используя тест php artisan test 9. 0013 Команда ремесленника.

Каталог поставщиков

Каталог поставщика содержит ваши зависимости Composer.

Каталог приложений

Большая часть вашего приложения находится в каталоге приложений . По умолчанию этот каталог находится в пространстве имен App и автоматически загружается Composer с использованием стандарта автозагрузки PSR-4.

Каталог app содержит множество дополнительных каталогов, таких как Console , Http и Поставщики . Думайте о каталогах Console и Http как о предоставлении API в ядре вашего приложения. Протокол HTTP и интерфейс командной строки являются механизмами взаимодействия с вашим приложением, но фактически не содержат логики приложения. Другими словами, это два способа подачи команд вашему приложению. Каталог Console содержит все ваши команды Artisan, а каталог Http содержит ваши контроллеры, промежуточное ПО и запросы.

Множество других каталогов будет создано внутри каталога app при использовании Artisan-команд make для создания классов. Так, например, каталог app/Jobs не будет существовать, пока вы не выполните Artisan-команду make:job для создания класса задания.

Примечание
Многие классы в каталоге app могут быть созданы Artisan с помощью команд. Чтобы просмотреть доступные команды, запустите php artisan list выполните команду в вашем терминале.

Каталог вещания

Каталог Broadcasting содержит все классы каналов вещания для вашего приложения. Эти классы создаются с помощью команды make:channel . Этот каталог не существует по умолчанию, но он будет создан для вас, когда вы создадите свой первый канал. Чтобы узнать больше о каналах, ознакомьтесь с документацией по трансляции событий.

Каталог консоли

Каталог Console содержит все пользовательские команды Artisan для вашего приложения. Эти команды можно сгенерировать с помощью команды make:command . В этом каталоге также находится ядро ​​вашей консоли, где регистрируются ваши пользовательские команды Artisan и определяются ваши запланированные задачи.

Каталог событий

Этот каталог не существует по умолчанию, но он будет создан для вас event:generate и make:event Команды мастера. Каталог Events содержит классы событий. События могут использоваться для оповещения других частей вашего приложения о том, что данное действие произошло, обеспечивая большую гибкость и разделение.

Каталог исключений

Каталог Exceptions содержит обработчик исключений вашего приложения, а также является хорошим местом для размещения любых исключений, создаваемых вашим приложением. Если вы хотите настроить регистрацию или отображение исключений, вам следует изменить Класс обработчика в этом каталоге.

Каталог Http

Каталог Http содержит ваши контроллеры, промежуточное ПО и запросы форм. Почти вся логика для обработки запросов, поступающих в ваше приложение, будет размещена в этом каталоге.

Каталог вакансий

Этот каталог не существует по умолчанию, но он будет создан для вас, если вы выполните команду make:job Artisan. Каталог Jobs содержит задания, стоящие в очереди для вашего приложения. Задания могут быть поставлены в очередь вашим приложением или выполняться синхронно в рамках текущего жизненного цикла запроса. Задания, которые выполняются синхронно во время текущего запроса, иногда называют «командами», поскольку они являются реализацией шаблона команды.

Каталог слушателей

Этот каталог не существует по умолчанию, но будет создан для вас, если вы выполните Artisan-команды event:generate или make:listener . Каталог Listeners содержит классы, обрабатывающие ваши события. Слушатели событий получают экземпляр события и выполняют логику в ответ на запуск события. Например, событие UserRegistered может обрабатываться прослушивателем SendWelcomeEmail .

Почтовый каталог

Этот каталог не существует по умолчанию, но он будет создан для вас, если вы выполните команду make:mail Artisan. Каталог Mail содержит все ваши классы, которые представляют электронные письма, отправленные вашим приложением. Почтовые объекты позволяют инкапсулировать всю логику создания электронного письма в одном простом классе, который можно отправить с помощью метода Mail::send .

Каталог моделей

Модели 9Каталог 0013 содержит все ваши классы моделей Eloquent. Eloquent ORM, входящий в состав Laravel, представляет собой красивую и простую реализацию ActiveRecord для работы с вашей базой данных. Каждая таблица базы данных имеет соответствующую «Модель», которая используется для взаимодействия с этой таблицей. Модели позволяют запрашивать данные в ваших таблицах, а также вставлять в таблицу новые записи.

Каталог уведомлений

Этот каталог не существует по умолчанию, но будет создан для вас, если вы выполните make:notification Мастерская команда. Каталог Notifications содержит все «транзакционные» уведомления, отправляемые вашим приложением, например простые уведомления о событиях, происходящих в вашем приложении. Функция уведомлений Laravel абстрагирует отправку уведомлений по различным драйверам, таким как электронная почта, Slack, SMS или хранится в базе данных.

Каталог политик

Этот каталог не существует по умолчанию, но будет создан для вас, если вы выполните make:policy Мастерская команда. Каталог Policies содержит классы политик авторизации для вашего приложения. Политики используются для определения того, может ли пользователь выполнять данное действие с ресурсом.

Каталог поставщиков

Каталог Providers содержит всех поставщиков услуг для вашего приложения. Поставщики услуг загружают ваше приложение, связывая службы в контейнере служб, регистрируя события или выполняя любые другие задачи для подготовки вашего приложения к входящим запросам.

В свежем приложении Laravel этот каталог уже будет содержать несколько провайдеров. Вы можете добавлять своих поставщиков в этот каталог по мере необходимости.

Каталог правил

Этот каталог не существует по умолчанию, но он будет создан для вас, если вы выполните команду make:rule Artisan. Каталог Rules содержит настраиваемые объекты правил проверки для вашего приложения. Правила используются для инкапсуляции сложной логики проверки в простой объект. Для получения дополнительной информации ознакомьтесь с документацией по валидации.

php — рекомендуется ли загружать файлы в папку за пределами общедоступной папки www?

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

Я видел, что некоторые люди создают папку (например, my_secret_folder ) на том же уровне каталога www . Затем они загружают файлы (с помощью скрипта PHP), используя:

 $destination = $_SERVER['DOCUMENT_ROOT'] . "/../моя_секретная_папка/" . $имя файла;
 

Где $destination — это полный путь к загруженному файлу.

Тогда доступ к файлу разрешен только PHP-скрипту (из папки www). Является ли хорошей практикой загружать файлы в папку за пределами общедоступной папки www?

1

Да, это хорошая практика. Размещение его за пределами веб-корня означает, что файлы не будут публично доступны из-за простой ошибки конфигурации на веб-сервере, тем самым добавляя еще один барьер для раскрытия — и это практически не требует затрат на реализацию.

1

Предполагая, что это сервер Apache, рассматривали ли вы возможность ограничения каталога?

 <Каталог '/var/www/html/uploads'>
    Параметры - Индексы
    <Ограничение ПОЛУЧИТЬ>
        Требовать администратора пользователя
    

 

Не показывать список файлов, если кто-то пытается просмотреть каталог и ограничить HTML GET тем, кто вошел в систему как администратор.

3

На это уже намекал @Voo в комментарии, но этот момент настолько важен, что я думаю, что его следует переместить в поле для ответов.

 $destination = $_SERVER['DOCUMENT_ROOT']."/../my_secret_folder/".$filename
 

Это хорошая практика, если и только если , веб-пользователь не может управлять $filename . В противном случае это уязвимость обхода пути.

Рассмотрим, что произойдет, если клиент создаст специальный запрос, где $filename это ../www/index.php . Вы только что разрешили загрузчику перезаписать код вашего веб-приложения.

Не поддавайтесь искушению решить эту проблему, занеся в черный список значения, такие как / и .. : есть способы обойти это, по ссылке выше перечислены некоторые из них. Каноническое решение этой проблемы состоит в том, чтобы либо (а) выбрать имена файлов самостоятельно, либо (б) иметь явный белый список разрешенных символов.