Файл не выбран загрузить файл
В данной статье описываются шаги, которые необходимо проделать, если вы не можете загрузить или сохранить файлы с помощью Firefox.
Известные проблемы: Пользователи, получающие ошибку загрузки после обновления на Firefox 69.0.2 или бета-70.0b11+ должны сначала прочитать следующую статью Невозможно загрузить файлы в Windows 10 при включённом родительском контроле. Примечание: Функция очистки Firefox может решить многие проблемы путём сброса Firefox в исходное состояние. При этом нужная вам информация будет сохранена. Попробуйте использовать эту функцию перед тем, как начать длительный процесс устранения неполадок.Оглавление
Firefox имеет функцию защиты загрузок, чтобы защитить вас от вредоносных или потенциально опасных файлов при загрузке. Если Firefox заблокировал небезопасную загрузку, вы увидите предупреждение о файле на панели "Загрузки", а также варианты обработки этой загрузки. Вы можете открыть панель "Загрузки", чтобы просмотреть завершённые и ожидающие загрузки, нажав кнопку "Загрузки" (стрелка вниз на панели инструментов). Для получения дополнительной информации, прочитайте статьи Поиск и управление загруженными файлами и Как работают встроенная Защита от Фишинга и Вредоносных программ?.
Firefox может быть не в состоянии загрузить файлы, если есть проблема с папкой, в которую сохраняются загружаемые файлы:
На Панели меню в верхней части экрана щёлкните Firefox и выберите Настройки . Нажмите на кнопку меню и выберите Настройки Настройки . Нажмите на кнопку меню и выберите Настройки .
Если вы попробовали приведенные выше рекомендации, вы можете восстановить настройки папки загрузки Firefox по умолчанию:
Чтобы решить эту проблему, перейдите в свой домашний каталог и удалите этот файл настроек:
Если не работает загрузка определенных типов файлов, убедитесь, что Firefox не настроен на особую обработку этих типов файлов, отличную от других. Прочтите статью Изменение действия производимого Firefox при щелчке по файлу или его загрузке для получения информации о том, как просматривать и изменять обработку различных типов файлов.
Сбросьте действия при загрузке для всех типов файлов
Чтобы сбросить обработку всех типов файлов в Firefox обратно в состояние по умолчанию:
Откройте папку вашего профиля:
- Щёлкните по кнопке меню , затем щёлкните по кнопке Справка и выберите Информация для решения проблем Информация для решения проблем . Из меню Справка выберите Информация для решения проблем Информация для решения проблем . Откроется вкладка Информация для решения проблем.
- В разделе Сведения о приложении рядом с Папка Директория профиля щёлкните по кнопке Открыть папку Показать в Finder Открыть каталог . Откроется окно, содержащее папку вашего профиля. Откроется папка вашего профиля.
Щёлкните по кнопке меню и выберите Выход .
Щёлкните по меню Firefox и выберите Выход . Откройте меню Firefox в верхней части экрана и выберите Выйти из Firefox . Откройте меню Firefox и выберите Выход .
Программы обеспечения безопасности в Интернете, в том числе межсетевой экран, антивирусные программы, антишпионские программы и другие могут блокировать загрузки определенных файлов. Проверьте настройки программного обеспечения безопасности, чтобы узнать, существует ли настройка, которая может блокировать загрузки.
Для проведения диагностики на предмет того, не вызывает ли проблемы программа Интернет-Безопасности, вы можете попробовать временно отключить её, проверить, работает ли загрузка файлов, а затем снова включить программу.
Это происходит потому, что Firefox принимает во внимание ваши настройки безопасности Windows для загрузки приложений и других потенциально опасных файлов из Интернета. Чтобы решить эту проблему, используйте решение приведенное ниже.
Сбросьте системные настройки Интернет-Безопасности
Вы можете сбросить системные настройки Интернет-безопасности в Internet Explorer. Прочтите статью Сброс параметров браузера Internet Explorer на сайте поддержки Microsoft для получения инструкций.
Вы можете провести диагностику вашей проблемы с загрузкой, следуя инструкциям в статье Диагностика и решение проблем в Firefox.
Эти прекрасные люди помогли написать эту статью:
Станьте волонтёром
Растите и делитесь опытом с другими. Отвечайте на вопросы и улучшайте нашу базу знаний.
у меня есть кнопка "Выбрать файл" следующим образом (я использую Jade, но он должен быть таким же, как Html5):
в браузере это показывает кнопку с текстом рядом с ним "нет выбранного файла". Я хотел бы изменить текст "Нет выбранного файла" на что-то другое, например "нет выбранного видео" или "выберите видео, пожалуйста". Я следовал первым предложениям здесь:
Я не хочу видеть "нет выбранного файла" для поля ввода файла
но это не изменило текст:
может кто-нибудь помочь мне выяснить, где проблема?
Я уверен, что вы не можете изменить метки по умолчанию на кнопках, они жестко закодированы в браузерах (каждый браузер отображает заголовки кнопок по-своему). Проверьте это кнопка стиль статьи
скрыть ввод с помощью css, добавить метку и назначить ее кнопке ввода. метка будет кликабельной, и при нажатии на нее запустится диалоговое окно файла.
затем стиль метки в виде кнопки, если вы хотите.
- скрыть ввод и добавить кнопку "файлы"
- затем вызовите кнопку "файлы" и попросите его связать fileupload (я использую JQuery в этом примере)
но если вы попытаетесь удалить эту подсказку
это не будет работать. Вот мой маленький трюк, чтобы работать с этим, попробуйте название с пробелом. Это сработает.:)
попробуйте это просто трюк
как это работает
Это очень просто. элемент Label использует тег " for " для ссылки на элемент формы по идентификатору. В этом случае мы использовали "img" В качестве опорного ключа между ними. Как только это будет сделано, всякий раз, когда вы нажимаете на метку, он автоматически запускает событие щелчка элемента формы, которое является событием щелчка элемента файла в нашем случае. Затем мы делаем элемент файла невидимым с помощью display:none и not видимость: скрытый, чтобы он не создавал пустое пространство.
наслаждайтесь кодирования
С появлением управляемого приложения и веб-клиента некоторые задачи, которые решались в обычном приложением за несколько строчек, существенно усложнились. Казалось бы такая простая и часто используемая операция, как интерактивный выбор файла, которая в обычном приложении решалась в одном методе, теперь требует создания цепочки из нескольких процедур, которые вызываются одна за другой через ОписаниеОповещения. Вот как это было с использованием модальных вызовов:
Но как эту задачу решить на веб-клиенте? В поисковике не удалось найти готового универсального решения. Поискал в типовых, но там все разбросано по модулям и как-то запутано. Посмотрел пример в консоли СКД с диска ИТС для управляемых форм. Там тоже надо вычленять по кусочкам все шаги. Кроме того там применяется одна фича, которая позволяет открывать диалог выбора файла без установленного расширения работы с файлами. Но в общем случае эта хитрость не подойдет, так как она работает только для существующих файлов, насколько я понял. Поэтому написал процедуры, которые можно просто скопировать и использовать в будущем, не тратя время на то, чтобы вспоминать, как это работает.
Диалог выбора файла
Сразу приведу код, который получился после упрощения.
Я специально привел ранее вариант для обычных форм, чтобы проще было сравнивать. Код разбился на две примитивные процедуры и практически не изменился за счет метода ВыполнитьСценарийВыбораФайла(). Этот метод скрывает все рутинные асинхронные действия:
- подключает расширение по работе с файлами
- если расширение не подключено, то задает пользователю вопрос по его подключению
- начинает установку расширения, если пользователь подтвердит это действие
- открывает диалог выбора файла
- передает результаты выбора файла назад в прикладную процедуру КаталогНачалоВыбораЗавершение()
Далее приведу код этой служебной процедуры, написанной по принципу, из этой статьи.
То есть вместо того, чтобы писать несколько процедур с труднопонимаемыми названиями в стиле ЗагрузитьФайлКонсолиПослеПодключенияРасширенияПослеПомещенияФайла() , вся последовательность действий описана в одной. Кроме того, можно заметить, что она универсальная и не содержит зависимостей от контекста формы. То есть ее можно перенести в другую форму простым копированием
Загрузка файлов с клиента на сервер
Постановка задачи: пусть требуется метод, который умеет помещать на сервер выбранный на клиенте файл. Если выбранный файл является каталогом, то необходимо поместить на сервер все файлы, содержащиеся в этом каталоге (подчиненные каталоги игнорировать).
Последовательность асинхронных действий:
- определить является ли файл каталогом
- если не является, то добавить его в массив помещаемых файлов
- если является, то найти все файлы этого каталога
- каждый из найденных файлов проверить является ли он каталогом. Если не является то добавить в массив помещаемых файлов (каждая итерация цикла обхода файлов является асинхронной, потому что вместо синхронного Файл.ЭтоФайл() необходимо использовать его аналог Файл.НачатьПроверкуЭтоФайл())
- поместить файлы на сервер
- вернуть результат помещения в прикладную процедуру, которая будет выполнять обработку файлов по какому-то алгоритму
Данная задача снова решается за три простых шага
Все детали скрыты в процедуре ВыполнитьСценарийЗагрузкиФайлаНаСервер(), которая подходит как для файлов, так и для каталогов. При необходимости ее можно доработать, чтобы она покрывала больше случаев.
Файл для скачивания
К публикации прилагается пример, который можно использовать как шаблон для описанных операций. В нем реализованы несколько наиболее востребованных случаев: выбор существующего файла, выбор имени файла для сохранения, выбор каталога и множественный выбор. Для полноты картины приведены аналогичные операции для обычных форм. Тестировались процедуры на платфроме 8.3, на конфигурацях начиная с режима совместимости 8.2.13
Функционал, отвечающий за отправку файлов на сервер, реализуется довольно просто. Как и в примерах из предыдущих уроков, за это отвечает специальное поле формы. Но ее настройка имеет некоторые особенности.
Если ваша форма содержит поля, отвечающие за загрузку файлов, то элементу
необходимо явным образом установить атрибут 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 .
В этой статье я расскажу об основах загрузки файлов в PHP. Во-первых, мы рассмотрим параметры конфигурации PHP, которые должны быть установлены для успешной загрузки файлов. После этого мы разработаем реальный пример загрузки файла.
Настройка параметров PHP
Существует несколько настроек конфигурации PHP, которые вам следует предварительно проверить для успешной загрузки файлов. В этом разделе мы рассмотрим все параметры, которые важны для загрузки файлов PHP. Эти параметры можно настроить в файле php.ini.
Если вы не знаете, где найти файл php.ini, вы можете использовать php_ini_loaded_file() , чтобы найти его. Просто создайте файл PHP на своем сервере со следующей строкой и откройте его из браузера.
Вот выдержка из установочного файла с некоторыми полезными значениями по умолчанию.
Ключевые настройки
file_uploads
Значение директивы file_uploads должно быть установлено на On , чтобы разрешить загрузку файлов. Значение по умолчанию для этой директивы - On .
upload_max_filesize
upload_tmp_dir
Устанавливает временный каталог, который будет использоваться для хранения загруженных файлов. В большинстве случаев вам не нужно беспокоиться об этой настройке. Если вы не установите его, будет использоваться системный временный каталог по умолчанию.
post_max_size
Директива post_max_size позволяет настроить максимальный размер данных POST. Поскольку файлы загружаются с помощью POST-запросов, это значение должно быть больше, чем указано в директиве upload_max_filesize . Например, если ваш upload_max_filesize составляет 16M (16 мегабайт), вам может потребоваться установить post_max_size в 20M .
max_file_uploads
Это позволяет вам установить максимальное количество файлов, которые могут быть загружены за раз. По умолчанию 20 , разумное количество.
max_input_time
Это максимальное количество секунд, которое скрипту разрешено анализировать входные данные. Вы должны установить его на разумное значение, если вы имеете дело с большими загрузками файлов. 60 (60 секунд) является хорошим показателем для большинства приложений.
memory_limit
Директива memory_limit указывает максимальный объем памяти, который может потреблять скрипт. Если вы сталкиваетесь с проблемами при загрузке больших файлов, вам необходимо убедиться, что значение этой директивы больше, чем указано в директиве post_max_size . Значение по умолчанию - 128M (128 мегабайт), поэтому, если у вас нет очень больших post_max_size и upload_max_filesize , вам не нужно беспокоиться об этом.
max_execution_time
Это максимальное количество секунд, разрешенное для работы скрипта. Если вы сталкиваетесь с проблемами при загрузке больших файлов, вы можете рассмотреть возможность увеличения этого значения. 30 (30 секунд) должны хорошо работать для большинства приложений.
Теперь давайте построим реальный пример, чтобы продемонстрировать загрузку файлов в PHP.
Создание формы HTML
После того, как вы настроили параметры PHP, вы готовы испытать возможности загрузки файлов PHP.
В нашем репозитории GitHub есть пример кода, который я собираюсь обсудить в этой статье. Итак, если вы хотите следовать ему, загрузите его из GitHub.
Мы собираемся создать два файла PHP: index.php и upload.php. Файл index.php содержит код, который отвечает за отображение формы загрузки файла. С другой стороны, файл upload.php отвечает за загрузку файла на сервер.
Кроме того, файл будет загружен в каталог uploaded_files, поэтому вам нужно убедиться, что эта папка существует и доступна для записи пользователем web-server .
В этом разделе мы рассмотрим ключевые части файла index.php.
Давайте посмотрим на файл index.php на GitHub:
Хотя это может показаться типичной формой PHP, существует важное различие в значении атрибута enctype тега <form> . Он должен быть установлен в multipart/form-data , так как форма содержит поле файла.
Атрибут enctype указывает тип кодировки, который должен использоваться при отправке формы, и он принимает одно из следующих трех значений:
- application/x-www-form-urlencoded : Это значение по умолчанию, когда вы не устанавливаете значение атрибута enctype явно. В этом случае символы кодируются перед отправкой на сервер. Если у вас нет поля файла в вашей форме, вы должны использовать это значение для атрибута enctype .
- multipart/form-data : Когда вы используете значение multipart/form-data для атрибута enctype , оно позволяет загружать файлы с использованием метода POST. Кроме того, он гарантирует, что символы не кодируются при отправке формы.
- text/plain : Обычно это не используется. С помощью этой настройки данные отправляются без кодирования.
Затем мы выводим поле файла, которое позволяет вам выбрать файл с вашего компьютера.
Итак, это был файл index.php. В следующем разделе мы рассмотрим, как обрабатывать загруженный файл на стороне сервера.
Логика загрузки
В предыдущем разделе мы создали форму HTML, которая отображается на стороне клиента и позволяет загружать файл с вашего компьютера. В этом разделе мы увидим серверную часть кода, которая позволяет обрабатывать загруженный файл.
Загрузите код из файла upload.php на GitHub. Мы рассмотрим важные части этого файла.
В файле upload.php мы проверили, действительно ли это валидный запрос POST.
В PHP, когда файл загружается, суперглобальная переменная $_FILES заполняется всей информацией о загруженном файле. Она инициализируется как массив и может содержать следующую информацию для успешной загрузки файла.
После проверки запроса POST мы проверяем, что загрузка файла прошла успешно.
Вы можете видеть, что переменная $_FILES является многомерным массивом, первый элемент - это имя поля файла, а второй элемент содержит информацию о загруженном файле, как мы уже говорили выше.
Если загрузка файла прошла успешно, мы инициализируем несколько переменных с информацией о загруженном файле.
В приведенном выше коде мы также выяснили расширение загруженного файла и сохранили его в переменной $fileExtension .
Поскольку загруженный файл может содержать пробелы и другие специальные символы, лучше очистить имя файла, и это именно то, что мы сделали в следующем шаге.
Важно, чтобы вы ограничивали тип файла, который может быть загружен на определенные расширения, и не разрешали все. Мы это сделали, проверив расширение загруженного файла с помощью набора расширений, который мы хотим разрешить для загрузки.
Наконец, мы используем функцию move_uploaded_file для перемещения загруженного файла в определенное место по нашему выбору.
Функция move_uploaded_file принимает два аргумента. Первым аргументом является имя файла загруженного файла, а второй аргумент - путь назначения, в который вы хотите переместить файл.
Как это все работает вместе
Не забудьте создать каталог uploaded_files и сделать его доступным для записи пользователем web-server. Затем перейдите и запустите файл index.php, который должен отобразить форму загрузки файла, которая выглядит так:
Заключение
Сегодня мы обсудили основы загрузки файлов на PHP. В первой половине статьи мы рассмотрели различные параметры конфигурации, которые должны быть установлены для загрузки файлов на работу. Затем мы рассмотрели реальный пример, который продемонстрировал, как загрузка файлов работает на PHP.
Надеюсь, вам понравилась эта статья, и вы можете свободно размещать свои вопросы и предложения ниже!
Читайте также: