Как удалить файл с upload
Функционал, отвечающий за отправку файлов на сервер, реализуется довольно просто. Как и в примерах из предыдущих уроков, за это отвечает специальное поле формы. Но ее настройка имеет некоторые особенности.
Если ваша форма содержит поля, отвечающие за загрузку файлов, то элементу
необходимо явным образом установить атрибут enctype в значение multipart/form-data , а method задать как POST .
Заметка
Приведенные выше значения атрибутов не связанны непосредственно с HTML. Они оптимизируют внутренние процессы браузера. Если вы правильным образом настроите элемент , отправка больших файлов будет произведена гораздо быстрее, а серверная программа сможет легко принять и обработать их.
Использование поля загрузки файлов
В HTML для отправки файлов из формы используется многозадачный элемент . Его атрибут type должен иметь значение file . Браузер отобразит такое поле в виде кнопки с текстом «выберите файл» или аналогичным.
При нажатии кнопки откроется проводник файловой системы. В нем можно перемещаться по директориям компьютера. Интерфейс интуитивно понятен любому пользователю. Все что нужно сделать — это найти нужный файл и нажать кнопку «Открыть». Отметим, что выбирать нужные документы и файлы может только сам пользователь. Явное указание атрибута value с именем или расположением какого-либо файла не приведет к успеху.
Чтобы выбранный файл был загружен при отправке формы, полю необходимо добавить атрибут name с уникальным значением.
Множественный выбор и блокировка поля
По умолчанию пользователь может выбрать только один файл, предназначенный к отправке. HTML позволяет изменить это поведение. Множественный выбор станет доступным после добавления к полю атрибута multiple .
Также нужно отметить, что поле загрузки файлов можно заблокировать с помощью атрибута disabled . Это сделает невозможным какое-либо взаимодействие с ним. Если оно заблокировано после осуществления выбора файла, он не будет отправлен вместе с остальными данными формы. Такая ситуация может возникнуть при использовании встроенного в браузер языка программирования JavaScript.
Принципы загрузки файлов
Любой загружаемый файл будет помещен в специальную директорию для временного хранения, а связанная с ним информация добавлена в суперглобальный массив $_FILES . Если не переместить файл в другое место, после завершения скрипта произойдет его бесследное удаление. Директория временного хранения определяется настройкой upload_tmp_dir конфигурационного файла php.ini .
Суперглобальный массив $_FILES
Если вместе с текущим запросом были загружены файлы, PHP-интерпретатор автоматически заполнит суперглобальный массив $_FILES соответствующей информацией. Его структура довольно проста. Элементы массива соответствуют именам параметров HTTP-запроса. Например, ваша веб-форма содержит поле загрузки файла с атрибутом « name="upload-file" ». В таком случае информация будет добавлена в $_FILES['upload-file'] .
Содержимое массива $_FILES:
Заметка
Существует одно требование к HTML-разметке полей, осуществляющих множественный выбор и загрузку файлов. Их атрибут name должен быть составлен следующим образом « name ». Если вы опустите конструкцию [] , PHP обработает только один файл.
Перемещение загруженного файла
Как говорилось выше, загружаемые файлы размещаются во временной директории сервера и автоматически удаляются PHP-интерпретатором после выполнения текущего запроса. Их можно сохранить, переместив в другое место. Использовать стандартные функции copy() или rename() крайне нежелательно.
Для перемещения загруженных файлов существует специальная функция move_uploaded_file() . Она принимает два обязательных строковых параметра. Первый указывает имя файла во временной директории, а второй - путь назначения. Функция возвращает true в случае успеха и false , если произошла ошибка.
С помощью функции is_uploaded_file() вы можете проверить, является ли файл загруженным в текущем запросе. Она принимает всего один параметр — имя файла, а возвращает результат логического типа.
Важно
PHP позволяет изменять местоположение загруженных файлов с помощью обычных функций копирования или перемещения. Однако это довольно опасно. Существует ряд ухищрённых атак, основанных на таком недальновидном подходе.
Для перемещения и проверки существования загруженных файлов всегда используйте функции move_uploaded_file() и is_uploaded_file() . В процессе выполнения они осуществляют расширенные проверки и автоматически отсеивают ряд распространенных атак.
Пример загрузки файла на сервер
Ниже приводится пример PHP-скрипта. Если он вызывается в первый раз, либо в текущем запросе отсутствует загрузка файла, пользователю выводится форма. При загрузке, файл перемещается в корневую директорию сайта, а пользователю показывается информация, связанная с ним. Обрабатываются только изображения в форматах jpg , jpeg и png .
первый вариант: через ssh(putty) удалить все файлы с датой создания больше указанной Если почистить только папку. Если таблицу в базе файлов, то пробежаться по ней и проверить существует ли этот файл.
Собрать файлы, которые были удалены и найти их в инфоблоках и затереть все за собой.
Короче говоря
1)чистим файлы
2)чистим базу
второй вариант: дернуть все файлы, которые актуальные(т.е. нужны) дальше найти файлы, которые не входят в этот список (arFilter=array("!ID"=>$arFiles)
Удалить эти файлы.
первый вариант быстрее удалит сами файлы, второй вариант сделает это правильней .
Тот аккаунт стал гостем, увы и ах.
Первый вариант не подходит, т.к. много элементов (а значит и файлов) с разными датами создания, в том числе и с самыми ранними.А второй это фактически тоже самое что я сам предложил )
Вопрос: как вы предлагаете проверить актуальность файла? В таблице с файлами есть поле с ID элемента к которому привязан этот файл?
нет, нету, ведь мы можем привязывать файл к любому элементу и не только инфоблока.
"Удаление старых элементов" я так понял вы удалили элементы, а записи о файлах осталисть еще.
Цитата |
---|
Сергей Гордеев пишет: собрать базу путей к активным |
Тот аккаунт стал гостем, увы и ах.
Тот аккаунт стал гостем, увы и ах.
Хобана. А вот тут проблемка. Записей в b_file 20000, а файлов /upload/iblock - более 400 тыс. Т.е. получается битрикс при удалении элементов файлы нихрена не удалял.
В общем получается я могу пробежаться по таблице b_file, составить базу актуальных путей к файлам, а все остальные файлы не вошедшие в эту базу удалить, верно?
Вопрос на засыпку. В /upload/iblock хранятся файлы только из таблицы b_file? Ничего лишнего я не потру если удалю файлы вышеописанным способом?Цитата |
---|
Сергей Гордеев пишет: В /upload/iblock хранятся файлы только из таблицы b_file? |
Тот аккаунт стал гостем, увы и ах.
если никто ничего руками не залил.
Сайт Startup'а - адаптивная Bootstrap вёрстка, композит, микроразметка . бесплатно На сколько я знаю, можно узнать дату последнего доступа к файлу, тем самым проверив, на сколько он актуален. Если параллельно проверять файлы по таблице b_file, то можно добиться высокой точности. и низкой скоростиЦитата |
---|
Алексей Задойный пишет: если никто ничего руками не залил. |
Тот аккаунт стал гостем, увы и ах.
Цитата |
---|
Олег Постоев пишет: На сколько я знаю, можно узнать дату последнего доступа к файлу, тем самым проверив, на сколько он актуален |
Цитата |
---|
Сергей Гордеев пишет: В /upload/iblock хранятся файлы только из таблицы b_file? Ничего лишнего я не потру если удалю файлы вышеописанным способом |
Только файлы из таблицы b_file. Читаете ее, читаете список файлов по всем вложенным каталогам, удаляете разницу. Перед удалением попробуйте посмотреть, что там за разница такая, откуда и что взялось - все таки десятки тысяч файлов просто так не появляются.
У меня один раз, на старом сайте, с приколами в favicon.ico (кто помнит старое содержимое этого файла, тот поймет), умудрились залить дор в папку /upload/. Заметил поздно. Там было несколько десятков К статических страниц. Может у вас то же. Или какие то глюки с правами, например может создавать, а удалять не может (ну мало ли).
А для спокойствия, сделайте резервную копию этого каталога.
P.s. поделитесь, плис, по итогам опытом - что там за лишние файлы такие были, очень уж любопытно.
А у вас случайно не включен документооборот в инфоблоках? В зависимости от настроек может хранить достаточно много копий элементов.Можно узнать получилось удалить неиспользуемые файлы, не затронув файлы активных элементов?
было бы интересно увидеть результат и возможно код для использованияВ общем пока за отсутствием времени проблему еще не решал. Как решу, постараюсь написать сюда.
Курс предназначен для базовой подготовки администраторов сайтов, созданных на "1С-Битрикс: Управление сайтом". Изучив курс, вы освоите основные методы администрирования системы, а также пополните знания по темам, изученным в курсе Контент-менеджер.
Если вы добросовестно изучите курс, то научитесь:
- управлять доступом к системе, сайтами, пользователями, группами пользователей;
- работать с инструментами системы;
- использовать возможности интерфейса по управлению системой;
- работать с модулями "1С-Битрикс: Управление сайтом", связанными с оптимизацией и безопасностью работы сайта;
- выполнять работу по конфигурированию веб-системы для оптимальной работы.
Если вам предстоит самостоятельная установка системы или перенос сайта на хостинг, то без курса Установка и настройка Курс Установка и настройка предназначен для специалистов устанавливающих "1С-Битрикс: Управление сайтом" или "Битрикс24 в коробке".
Начальные требования
Необходимый минимум знаний для изучения курса:
- базовые навыки компьютерной грамотности и навыков работы с ОС Windows;
- базовые знания о WWW и организации доступа к веб-серверу;
- знание системы в рамках курса Контент-менеджер Мы считаем, что вы этот курс уже прошли и знаете многое о Битриксе. Поэтому подсказок во всплывающих окнах будет намного меньше, чем в курсе Контент-менеджер. , чтобы банально не путаться в интерфейсе.
Неплохо было бы иметь базовые навыки установки и администрирования *nix-систем.
У нас часто спрашивают, сколько нужно заплатить
Курс полностью бесплатен. Изучение курса, прохождение итоговых тестов и получение сертификатов - ничего из этого оплачивать не нужно.
Ещё у нас есть Академия 1С-Битрикс, где можно обучиться на платной основе на курсах нашей компании либо наших партнёров.
Баллы опыта
В конце каждого урока есть кнопка Прочитано! . При клике на неё в Вашу итоговую таблицу опыта добавляется то количество баллов, которое указано в прочитанном После нажатия кнопки Прочитано! появится
окно подтверждения:
уроке.
Периодически мы заново оцениваем сложность уроков, увеличивая/уменьшая число баллов, поэтому итоговое количество набранных Вами баллов может отличаться от максимально возможного. Не переживайте! Отличный результат - это если общее число набранных Вами баллов отличается от максимального на 1-2%.
Тесты и сертификат
После изучения курса пройдите тесты на сертификацию. При успешной сдаче последовательности тестов на странице Моё обучение вы увидите результат обучения и там же - ваш сертификат в формате PDF.
Иконка успешно сданного вами курса отображается в вашем профиле на Freelance, если вы укажите ссылку на ваш профиль на сайте компании 1С-Битрикс.
Комментарии к урокам
Для преподавания оффлайн
Если данный курс берётся в качестве основы для оффлайного преподавания, то рекомендуемая продолжительность: 3 дня (24 академических часа).
Если нет интернета
iPhone:
FBReader
CoolReader
iBook
Bookmate
Windows:
Calibre
FBReader
Icecream Ebook Reader
Плагины для браузеров:
EpuBReader – для Firefox
Readium – для Google Chrome
iOS
Marvin for iOS
ShortBook
обновляются периодически, поэтому возможно некоторое отставание их от онлайновой версии курса. Версия файла - от 01.10.2021.
Как проходить учебный курс?
Похожим и я пользуюсь. Привожу фрагмент PHP кода, который удалит из выбранной папки (с подпапками) файлы которые никто не просматривался более $ttl мин назад. (у меня используется для удалении закэшированных уменьшенных изображений)
public function clearCache($ttl = self::DEFAULT_CACHE_TTL)
$ttl = (int) $ttl;
$dir = escapeshellcmd($this->_cacheDir);
$command = "find \! -type d -amin + -exec rm -v '<>' ';'";
exec($command, $stringOutput);
return $stringOutput;
>
Немного ненужного ответа:
Я думаю, что папку tmp ты можешь очистить точно, если хостинг под никсами.
Всякие логи тоже почисть и почту.
Иногда может вполне прилично освободиться места.
А всё остальное всё равно может быть хитро, но задействовано.
Тут уже надо аккуратно.
Как бы автоматизировать этот процесс подсказать уже не могу.
Сайты настолько безобразно написаны, там копипаст обычных html страниц. Никаких php и js скриптов, сплошной html и изображения.
копируете на комп. создаете в дримвивере по одному «сайту» на каждый сайт. затем просите дримвивер поискать сиротинушек (Site, Check links sitewide (Ctrl+F8) и в результатах фильтр по orphaned files)
Отлично! То, что нужно. Все сработало. Огромное вам спасибо! не за что :)можете ткнуть в ссылку «решение» возле ответа, тогда в системе будет видно что этот вопрос уже имеет решение ;) Если это простой хтмл и я правильно понял задачу — можно положить сайт на апач, выкачать его целиком (например, teleport-ом) — потом напарсить по логам, что загрузилось.
Чего там нет — в топку. Можно попытаться поставить бот выкачать этот сайт с соблюдением структуры, бот только по ссылкам ходит. Потом сравнить две папки, всё что на сайте есть, а в локальной копии нет — мусор.
Методов решения вашей задачи в общем случае не существует. Вероятность удалить целевой контент стремится к 100%. Никакой телепорт не поможет найти разделы, на которые не ведут ссылки с других страниц, но на которые есть ссылки снаружи.
С другой стороны — сайты можно выкачать на свой комп, потом почистить (тем же методом телепорта), а если что нужное из копии восстановить.
Но наиболее грамотным является наращивание диска, т.к. сейчас это не проблемно.
Скрипт для очистки каталога upload/iblock сайта на CMS 1С-Битрикс от неиспользуемых файлов (оставшихся после удаления элемента инфоблока).
Скрипт для очистки каталога upload/iblock от неиспользуемых файлов, которые могут оставаться после удаления элемента инфоблока и, особенно, многократных обменов с 1С.
Скрипт проверяет каждый файл в каталоге upload/iblock , есть ли он в таблице b_file и если его там нет выводит полный путь к нему на экран.
--move-file=/путь : перемещает файл в указанную директорию с сохранением иерархии.
--delete-files : удаляет файл и каталог, в котором находился удаляемый файл (если он пуст).
В настоящий момент реализован простейший алгоритм, который перед сканированием каталога upload/iblock загружает все имена файлов из таблицы b_file в оперативную память, поэтому надо иметь в виду, что в случае нехватки памяти скрипт будет падать.
Важное замечание про short_open_tag PHP
При использовании более-менее современных версий PHP (точно для версий 7+) при запуске скрипта из консоли вы вместо результата можете увидеть какой-то исходный код, завершающийся ошибкой
В этом случае вам необходимо в конфигурации PHP (обычно php.ini ), предназначенную для запуска PHP в консоли, включить опцию short_open_tag = On , т.к. в ядре Битрикса еще очень много кода, используюшего именно сокращенный вариант тэга, обозначающего начало php-кода.
Путь к php.ini на сервере вы можете узнать, выполнив в консоли команду:
Изменять лучше не сам php.ini, а добавить в каталог (путь пишу для моего примера) /etc/php/7.3/cli/conf.d файл с именем 99-bitrix.ini и добавить в него следующее содержимое:
После этого скрипт заработает и у вас :-)
Получить список всех неиспользуемых файлов из каталога upload/iblock:
Переместить все неиспользуемые файлы из каталога upload/iblock в папку /backup:
Удалить все неиспользуемые файлы из каталога upload/iblock:
About
Скрипт для очистки каталога upload/iblock сайта на CMS 1С-Битрикс от неиспользуемых файлов (оставшихся после удаления элемента инфоблока).
Читайте также: