39 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Загрузка нескольких файлов на сервер php

Форма загрузки нескольких файлов на сервер

Всем добрый день.

Есть форма загрузки файла на сервер.

Подскажите, как сделать форму загрузки нескольких файлов одновременно?

Либо множественный выбор фалов, либо возможность добавлять поля выбора файла при нажатии на какую-нибудь кнопку.

Добавлено через 2 часа 16 минут
Форму переделал.
Теперь можно выбирать несколько файлов.

В $_FILES теперь передается такое:

Как разобрать этот массив и сделать обработку по подобию загрузки одного файла?
Еще раз скрипт обработки:

Никак не пойму Массивы совсем не мое.

Форма загрузки файлов-изображений на сервер
Скорее всего тут не один пхп. Но вообще не сильно силен – пытаюсь на примерах с вебом разобраться.

Форма загрузки файлов на сервер. Как получить ссылку
Здравствуйте! Прошу помощи. Очень нужно что бы форма загрузки файлов на сервер после выдавала.

Форма загрузки нескольких изображений
+ взаимодействие сразу с двумя таблицами БД. <form action="load.php" method="post"> <input.

Вывод файлов и форма загрузки/удаления файлов работают на одной странице, а на другой в ячейках таблицы нет
Доброго времени суток. В общем ситуация следующая. В своем профиле пользователь загружает файлы.

Вот это вы зря, как можно программировать без понимания массивов?

По поводу вашего вопроса, с ходу только вижу пробежаться в цикле по элементам массива например так:

Да они мне трудно даются + пошли вторые сутки без сна, мозг раком встает уже.

Спасибо за ответ. Вернусь с совещания и проверю.

Добавлено через 45 минут
Xenox, Огромное спасибо. Ваш пример помог мне разобраться и дописать нужный функционал.
Сейчас приведу код в порядок и выложу решение, вдруг кому понадобится.

Добавлено через 3 минуты
Может не совсем изящно, но работает. Нужные файлы загружает, а файлы с неположенным расширением отсеивает.

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Форма загрузки файлов – не работает
Здравствуйте, уважаемые программисты. Помогите, пожалуйста, поправить код загрузки файлов. Вот сам.

Ошибка загрузки нескольких файлов
Здравствуйте! Когда делаю загрузку на сервер один файл ссылка на бд выводит правильно. А если делаю.

ajax + php форма загрузки файлов
Приветствую всех! Есть такая задача сделать форму для отправки статьи на сайт с загрузкой.

Сервер загрузки файлов
Хочу сделать, что-то типа сервера закачки файлов. Сперва хотел сделать на основе асинхронных.

Загрузка файла(ов) на сервер из формы средствами PHP

Сегодня загрузка файлов является практически неотъемлемым атрибутом современного web приложения. В данной статье речь пойдёт о том, как же загрузить файл(ы) на сервер с помощью PHP.

Навигация по статье:

Настройка php.ini

Конфигурационный файл php.ini необходимо настраивать согласно бизнес-логики проекта! Например, мы планируем загружать не более десяти файлов до 2 Мбайт, а это значит нам понадобиться

20 Мбайт памяти.

Загрузка одного файла на сервер из формы

Для начала разберём механизм загрузки одной картинки на сервер. Для загрузки картинки с компьютера пользователя необходимо с помощью HTML-формы отправить нужный (выбранный) файл PHP-скрипту upload.php методом POST и указать способ кодирования данных enctype=”multipart/form-data” (в данном случае данные не кодируются и это значение применяется только для отправки бинарных файлов).

После отправки файла PHP-скрипту upload.php его можно перехватить с помощью суперглобальной переменной $_FILES с таким же именем, которая в массиве содержит информацию о файле (в нашем случае image ):

Не всем данным из $_FILES можно доверять: MIME-тип и размер файла можно подделать, т. к. они формируются из HTTP-ответа, а расширению в имени файла не стоит доверять в силу того, что за ним может скрываться совершенно другой файл. Тем не менее, дальше нам нужно проверить корректно ли загрузился наш файл и загрузился ли он вообще. Для этого необходимо проверить ошибки в $_FILES[‘image’][‘error’] и удостовериться, что файл загружен методом POST с помощью функции is_uploaded_file() . Если что-то идёт не по плану, значит выводим ошибку на экран:

Для того, чтобы “редиска” не загрузил вредоносный код, встроенный в изображение, нельзя доверять функции getimagesize() , которая также возвращает MIME-тип. Функция ожидает, что первый аргумент является ссылкой на корректный файл изображения. Определить настоящий MIME-тип картинки можно через расширение FileInfo . Код ниже проверит наличие ключевого слова image в типе нашего загружаемого файла и если его не окажется, выдаст ошибку:

Таким образом, при необходимости, делаем проверку и на другие MIME-типы. Например, для zip архивов проверка будет такая:

На данном этапе мы уже можем загружать абсолютно любые картинки на наш сервер, прошедшие проверку на MIME-тип, но для загрузки изображений по определённым характеристикам нам необходимо валидировать их с помощью функции getimagesize() , которой отдадим сам бинарный файл $_FILES[‘image’][‘tmp_name’] . В результате мы получим массив из элементов:

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

После всех проверок мы можем с уверенностью переместить наш загружаемый файл в какую-нибудь директорию с картинками. Делать лучше это через функцию move_uploaded_file(), которая работает в безопасном режиме. Перед перемещением файла нельзя забыть сгенерировать случайное имя и расширение из типа изображения для нашего файла. Вот так это выглядит:

Вместо простого способа генерации имени файла на основе MD5-хеша можно пойти более продвинутым путём, а именно написать отдельную функцию, которая будет проверять уникальность названия картинки для того, чтобы случайно не перезаписать уже загруженный файл. Если такого названия ещё нет, функция сгенерирует его. Такая проблема появляется в больших проектах и с большим количеством картинок. Но всё же)

Генерация имени для картинки теперь будет такой:

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

Загрузка нескольких файлов на сервер из формы

Разберём механизм загрузки нескольких изображений за один раз с локальной машины пользователя. Продолжим дальше работать с $_FILES . Наша новая HTML-форма будет немного отличаться от старой.

Как видно в конец имени поля выбора файла name=”images[]” добавились фигурные скобки и атрибут multiple , который разрешает браузеру выбрать несколько файлов. Все файлы снова загрузятся во временную папку, если не будет никаких ошибок в php.ini . Перехватить их можно в $_FILES , но на этот раз суперглобальная переменная будет иметь неудобную структуру для обработки данных в массиве. Решается эта задача небольшими манипуляциями с массивом:

Мы реализовали механизм загрузки нескольких файлов на сервер. Весь код целиком лежит здесь .

Загрузка файлов на сервер

Что такое Upload files, или почему не работает
copy (“c:imagessample.jpg”, “http://mysite.ru/uploads/sample.jpg “)

Даже если у Вас в распоряжении всего один компьютер, на котором совмещен и сервер и рабочая станция, не стоит забывать о том, что php использует технологию клиент/сервер. Файл, который мы хотим загрузить, как правило, находится на машине клиента, т.е. пользователя, обыкновенного посетителя сайта. Место назначения – сервер. Для того чтобы совершить процесс передачи файла, нам понадобиться следующая форма:

При этом в поле action должен быть указан URL Вашего php-скрипта, который в дальнейшем будет заниматься обработкой загружаемых файлов. Скрытое поле MAX_FILE_SIZE должно предшествовать полю выбора файла, и содержать максимально допустимый размер файла в байтах. Его назначение – проверка размера файла еще до момента отправки файла на сервер. Это должно избавить пользователя от длительной и безрезультатной загрузки файла на сервер и образования лишнего трафика, но не стоит особо полагаться на это ограничение, так как его легко обойти.

Что происходит, когда пользователь выбрал файл на своем диске, и нажал на кнопку “Send file”? Браузер отсылает файл на сервер, где php-интерпретатор помещает его в свою временную директорию, присваивая ему случайное имя и выполняет скрипт, указанный в поле action.

Как должен выглядеть upload.php?

При написании скрипта, возникает естественный вопрос: как получить информацию о загруженном файле и достучаться до самого файла. Если Вы используете PHP версии 4.1.0 и старше, лучше всего будет обратиться к глобальному массиву $_FILES. Для каждого загруженного файла он содержит хеш-массив, со следующими данными:

  • $_FILES[‘userfile’][‘name’] – оригинальное имя файла, такое, каким его видел пользователь, выбирая файл;
  • $_FILES[‘userfile’][‘type’] – mime/type файла, к примеру, может быть image/gif; это поле полезно сохранить, если Вы хотите предоставлять интерфейс для скачивания загруженных файлов;
  • $_FILES[‘userfile’][‘size’] – размер загруженного файла;
  • $_FILES[‘userfile’][‘tmp_name’] – полный путь к временному файлу на диске;
  • $_FILES[‘userfile’][‘error’] – Начиная с версии 4.2.0, содержит код ошибки, который равен 0, если операция прошла успешно.

Для PHP версии ниже 4.1.0 этот массив называется $HTTP_POST_FILES. Не стоит забывать, что в отличие от $_FILES этот массив не является суперглобальным и при обращении к нему, к примеру, из функции, необходимо явно указывать global $HTTP_POST_FILES;

Если в настройках Вашего сервера register_globals=on, будут созданы дополнительные переменные вида $userfile_name, $userfile_type, $userfile_size… Учитывая, что, начиная с версии 4.2.0, в настройках по умолчанию register_globals=off использования этих переменных не рекомендовано, даже если они определены. Лучший способ получения информации о загружаемых файлах – использовать массив $_FILES.

Читать еще:  0xc0000098 при установке Windows 7 с флешки

Для работы с загруженными файлами лучше всего использовать встроенные функции is_uploaded_file() и move_uploaded_file(), которые проверяют, был ли загружен файл, и помещают его в указанную папку соответственно. Более детальную информацию Вы можете найти на страницах руководства. Не стоит изобретать велосипед и работать самому с временными файлами, копировать их, удалять. Это уже сделано до Вас и для Вас.

Настройка сервера

Я все сделал правильно, но у меня что-то не работает. Может, у меня неправильно сконфигурирован сервер?

Если Вы “все сделали правильно”, но Ваш код неработает, или работает неправильно, не спешите отчаиваться. Возможно проблема не в Ваших руках, а в неверных настройках сервера. Вот список директив, которые имеют отношения к загрузке файлов:

В файле php.ini:

  • Если Вы хотите узнать, где расположен Ваш php.ini, выполните
  • file_uploads – возможность запретить или разрешить загрузку файлов в целом. По умолчанию On.
  • upload_max_filesize – максимальный размер файла, который может быть загружен. Если Вам необходимо работать с большими файлами, измените эту настройку. По умолчанию 2М. Не забудьте изменить post_max_size.
  • post_max_size – общее ограничение сверху на размер данных, передаваемых в POST запросе. Если Вам необходимо работать с большими файлами, или передавать несколько файлов одновременно, измените эту настройку. Значение по умолчанию 8М.
  • upload_tmp_dir – временная директория на сервере, в которую будут помещаться все загружаемые файлы. Проверьте, какие на нее выставлены права(если на данном этапе у Вас возникли сложности, смотрите пояснения в конце статьи). Такая директория должна существовать и у пользователя, под которым выполняется Apache, также должны быть права на запись в эту директорию. Если Вы работаете с включенным ограничением open_basedir – то временный каталог должен находиться внутри. Вам не нужно заботиться о ее чистке или об уникальности имен, PHP решает эту проблему за Вас.

В файле httpd.conf:

    Прежде всего, убедитесь, что Вы используете веб-сервер Apache 1.3 (последняя версия на момент написания статьи – 1.3.27). Если Вы используете Apache 2.0, Вам следует прочитать следующий отрывок из документации:

Do not use Apache 2.0 and PHP in a production environment neither on Unix nor on Windows.

  • Если Вы получили сообщение “POST Method Not Allowed”, это означает, что надо искать что-то похожее на следующие директивы, и использовать ключевое слово Allow:
  • Проблемы с загрузкой бинарных файлов – классический вопрос “почему бьются файлы при upload”. Вот способ решения, предложенный Димой Бородином (http://php.spb.ru): В директории, где лежит скрипт, делаем файл .htaccess, в котором пишем: В файл httpd.conf дописать строки:
  • Небольшие пояснения, к этому рецепту: вышеописанная проблема, когда загруженные на сервер архивы не распаковываются и картинки не отображаются, может возникать из-за того, что используется веб-сервер Russian Apache. Директива CharsetDisable отключает модуль charset-processing module, т.е. никакой перекодировки при скачивании файлов, находящихся в данной папке, происходить не будет. Директива CharsetRecodeMultipartForms выключает перекодировку данных, переданных методом POST с заголовком Content-Type: multipart/form-data. Т.е. двоичные данные, переданные с такой настройкой, будут оставлены в первоначальном виде, а все остальное наполнение сайта будет перекодировано согласно текущим настройкам сервера.

    Но при этом могут возникнуть осложнения: будьте готовы к тому, что в некоторых случаях текстовые части запросов вам придется перекодировать самостоятельно. Вот что по этому поводу говорится в документации:

    Используйте директиву CharsetRecodeMultipartForms, которая появилась в PL23, но при этом вам все-равно придется перекодировать вручную текстовые части запросов. Для этого можно использовать Russian Apache API, доступное в других модулях или Russian Apache Perl API, доступное из mod_perl.

    Один из примеров определения кодировки вы можете найти тут: http://tony2001.phpclub.net/detect_charset/detect.phps

    Самая свежая документация по Russian Apache находится на его официальном сайте: http://apache.lexa.ru/.

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

    Также возможна настройка параметров Apach с помощью .htaccess:

    Дополнительные возможности

    Загрузка нескольких файлов одновременно

    Пример формы загрузки нескольких файлов:

    И не забудьте увеличить post_max_size, если предполагается много файлов

    Автоматическая загрузка файлов на сервер

    Не стоит забывать, что файлы на диске пользователя – конфиденциальная информация, к которой ни JavaScript, ни уж тем более PHP не имеют ни малейшего отношения. До тех пор, пока пользователь сам не выбрал файл при помощи ни о какой работе с ним не может идти и речи. И не забывайте, что у данного поля ввода атрибут value защищен от записи.

    Хранение файлов в базе данных mySQL

    Если Вы собрались хранить загружаемы файлы в базе данных, Вам необходимо помнить следующие моменты:

    • Необходимо использовать поле типа BLOB
    • Перед тем, как класть в базу, не забыть применить к строке mysql_escape_string()
    • При отображении файла необходимо указывать заголовок content/type

    Помните, что скрипт отображающий ваш HTML никак не связан со скриптом, который должен выводить изображение. Это должны быть два различные приложения.

    Хранение картинок в базе не является хорошем стилем. Гораздо удобней хранить в базе лишь пути к файлам изображений.

    Получение свойств изображения.

    Если перед вами возникла задача проверить тип или размеры картинки перед загрузкой файла на сервер, вам потребуется функция getimagesize(). В качестве аргумента она принимает имя файла на диске и возвращает массив, первые два элемента которого – ширина и высота соответственно, третий – тип изображения. В случае невозможности прочитать из указанного файла корректное изображение, функция возвращает ложь.

    Загрузка файлов, имеющих русско-язычное название

    При загрузке на сервер файлов, необходимо проверять их оригинальные имена на предмет наличия “нестандартных” символов (к примеру русских букв). В случае их присутствия необходимо произвести замену. Оригинальное имя файла можно найти в переменной $_FILES[‘userfile’][‘name’]. Как перекодировать русскоязычную строку в транслит можно можно найти в примерах PHP.

    Отображения статуса загрузки (Progress bar)

    Необходимо учитывать, что до полной загрузки файла, PHP не может оперировать ни размером файла, ни процентом его загрузки. Только когда файл уже находится на сервере PHP, то он получает возможность обращаться к информации. Если вам все-таки крайне необходимо реализовать такую возможность, воспользуйтесь Java-аплетом.

    Права на файлы

    Проблемы с правами на сервере (upload_tmp_dir)

    В Unix-подобных операционных системах каждой папке, файлу, ссылке выставлены соответствие права доступа. Они могут выглядеть как rwx-rw-r- или же как число 754.

    Доступность файла или каталога зависят от идентификатора пользователя и идентификатора группы, в которую он входит. Режим в целом описывается в терминах трех последовательностей, по три буквы в каждой:

    Здесь владелец, члены группы и все прочие пользователи обладают правами чтения файла, записи в него и его выполнения. Права – любая осмысленная комбинация следующих букв:

    r Право на чтение. (4)
    w Право на запись. (2)
    x Право на выполнение (поиск в каталоге). (1)

    Для того, что бы загрузка файлов на сервер работала корректно, необходимо реализовать один из двух вариантов

  • Установить владельцем каталога пользователя, с чьими привелегиями выполняется apache. Это можно узнать из файла httpd.conf или просмотрев список процессов на сервере. Права на каталог должны быть 700 (rwx——).
  • Независимо от того, кто является владельцем каталога, установить права 777 (rwxrwxrwx).

    Пример реализации загрузки картинок на сервер.

    Оригинал статьи находится на сайте PHP Club

    Загрузка файлов на сервер в PHP

    Наверняка, Вы часто загружали различные файлы на сайты. Например, загружали аватары на форуме, фотографии в социальных сетях, различные видеоролики на видеохостинги, просто файлы на файлообменники. И вот в этой статье Вы узнаете, как загрузить файлы на сервер в PHP. Именно через PHP в большинстве случаев это и реализуют.

    Первым делом, что нужно усвоить – это то, что сама HTML-форма, в которую подставляется файл должна быть не совсем обычной, вот пример HTML-кода такой формы:

    Ключевой момент здесь – это атрибут “enctype” со значением “multipart/form-data“. Без него ничего работать не будет.

    Теперь пишем скрипт “loading.php“, в котором мы ещё загружать файл не будем, а пройдёмся немного по различным важным моментам, которые надо обязательно учитывать, иначе может пострадать безопасность:

    В результате, Вы увидите содержимое глобального двумерного массива $_FILES:

    • name – имя загружаемого файла.
    • typeMIME-type загружаемого файла. Это, пожалуй, самый важный параметр для обеспечения безопасности. И всегда при приёме файлов необходимо проверять MIME-type, иначе проблем не оберётесь. В следующей статье мы поговорим об этом более детально.
    • tmp_name – физический путь к временному файлу. Именно в это место и помещается файл, а уже потом мы его переносим в другое место. Фактически, файл уже загружен, а нам лишь надо его переместить в нужную папку на сервере.
    • error – код ошибки. Если , то ошибок нет.
    • size – размер загружаемого файла. Вот это тоже частоиспользуемая опция, и её также надо проверять, чтобы ограничить размер загружаемых файлов. Безусловно, самим сервером этот размер ограничен, однако, для всяких картинок, этот размер явно завышен (как правило, он 10 МБ).

    И все эти параметры присутствуют для каждого загружаемого файла (каждые из которых представляют собой массив в двумерном массиве $_FILES).

    Читать еще:  Как увеличить системный кэш Windows 7?

    Теперь давайте уже закончим с загрузкой файлов на сервер в PHP, и для этого напишем такой код (“loading.php“):

    То есть вначале мы задаём путь к загружаемому файлу на сервере. Здесь мы хотим поместить файл в директорию “images” с тем же именем, что и было раньше у файла. А функцией move_uploaded_file() мы перемещаем файл в выбранную нами директорию из его временного хранилища.

    Однако, обратите внимание, это очень важно! Так использовать код ни в коем случае нельзя, иначе Вашему сайту будет угрожать серьёзная опасность! Фактически, на данный момент может быть загружено абсолютно всё, что угодно: любые исполняемые файлы, скрипты, HTML-страницы и другие весьма опасные вещи. Поэтому обязательно надо проверять загружаемые файлы на сервер очень тщательно. И вот этим мы и займёмся в следующей статье. Поскольку тема очень важная, то я советую Вам подписаться на обновления, чтобы не пропустить эту статью.

    Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

    Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
    Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

    Если Вы не хотите пропустить новые материалы на сайте,
    то Вы можете подписаться на обновления: Подписаться на обновления

    Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

    Порекомендуйте эту статью друзьям:

    Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

    Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 62 ):

    У меня этот скрипт не работает! Неделю голову ломал. PHP говорит, что одно значение лишнее. Убирал каждое по очереди: в двух синтаксическая ошибка, в другой – просто ничего.

    Вот посмотри тут может яснее будет http://saitsozdanie.ru/php/php-zagruzka-fajlov-na-server.html

    а что прописывается в пункте [somename] и [tmp_name]?? в [name] пишется имя файла, что на форме?

    somename – это название поля с файлом в HTML-форме, а в tmp_name прописывается временный путь к файлу на сервере. Он генерируется самим PHP.

    тоесть [tmp_name] оставляем пустым или так и писать [tmp_name]? (Выберите фоновый рисунок: ) Здесь [somename]=path? а что пишется тогда в после [name]?

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

    ————— “; PRINT “Вас приветствует “.$_POST[‘firstname’]; PRINT “

    “; PRINT “Название статьи – “.$_POST[‘articlename’]; Print “

    “; $uploadfile = “images/”.$_FILES[‘somename’][‘name’]; move_uploaded_file($_FILES[‘somename’][‘tmp_name’], $uploadfile); ?> вроде бы сделал все правильно, но ничего вообще не выводит.

    Учитесь искать ошибки самостоятельно: http://myrusakov.ru/php-finderror.html Это действительно очень важно! И на будущее. Ваши ошибки происходят от того, что Вы изначально неправильно работаете. Вот правильный подход к программированию: http://myrusakov.ru/how-programming.html

    Михаил, помогите с загрузкой нескольких файлов на сервер.

    Создайте несколько полей типа file, и берите все файлы из массива $_FILES.

    а как-то более красивше. ну скажем, нельзя же предусмотреть, сколько изображений клиент захочет загрузить. как работать с multiple?

    И так красиво. А поля можно добавлять по мере их заполнения через JavaScript.

    У Вас есть статья, как добавлять эти поля после заполнения верхних через яву?

    Через onclick можно и проверку value, если оно не пустое, то добавить ещё одно поле, иначе ничего не делать. Если знаете JS, то прекрасно меня поймёте. Если нет, то статей подобных у меня нет.

    Здравствуйте, у меня php выдает ошибки: [[ Warning: move_uploaded_file(images/img.png) [function.move-uploaded-file]: failed to open stream: No such file or directory in I:hometest1.ruwwwloading.php on line 3 Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move ‘I:tmpphpF453.tmp’ to ‘images/img.png’ in I:hometest1.ruwwwloading.php on line 3 ]]

    Директории не существует, куда Вы отправляете файл.

    Народ у меня есть скрипт, но я не могу реализовать под php – помогите пожалуйста!

    Мне кто-нибудь поможет. Я даж заплачу за потраченное время!

    Михаил, а почему бы вам не сделать свой хостинг изображений специально для форума, чтобы люди могли загружать изображения и вставлять ссылку в сообщение на форуме? Было бы очень удобно а главное оригинально так как никто не додумается такое сделать и вы будете единственным с такой возможностью

    Идея не нова, но я так сделаю. Но всё это будет не раньше весны.

    Будет интересно посмотреть

    В статье ошибка, в самом начале, пропущена буква “О” в слове “видеОхостинги”. Мелочь, конечно. 🙂

    У меня такая проблема: записываю файл на сервер, всё записывается нормально. Но если попытаться снова записать с тем же именем, то он не перезаписывается. Но время файла (атрибуты) обновляется. Не подскажете как быть?

    Всё должно перезаписываться, из-за чего такая ошибка – да миллиард причин могу придумать, даже больше. Первый вариант – невнимательность, перезаписываете на один и тот же файл. Второй вариант – попробуйте в другом браузере файл отправить. Остальные варианты уже сами придумывайте, их очень много. В общем, тут надо просто всё очень тщательно проверять. Вот ещё этот метод можно использовать: http://myrusakov.ru/php-finderror.html

    У меня получается что изображение с веб камеры сохраняется допустим с именем 123.jpg. если такого файла нет, то всё нормально. А если я хочу это фото обновить. То есть перезаписать по верх старого, он только атрибуты файла меняет. А само изображение не перезаписывает. У меня подозрение что я просто что то не так делаю. Может сперва старый файл удалить нужно?

    Попробуйте так, для удаления используйте unlink().

    Так и сделал. Всё получилось! Благодарю.

    У меня проблема такая: не могу загрузить на сервер. На всех папках стоит право доступа 777. Код: http://pastebin.com/p6Ash6BN

    Код ошибки какой?

    Михаил, такой вопрос. Фотография выводится на одной странице со ссылкой на статью, как сделать, так чтобы эта же картинка выводилась на странице со статьей??

    Здравствуйте Михаил, хотел спросить, делаю загрузку файлов,все работает пока не загружаю файл размер которого больше post_max_size = 8M, после нажатия кнопки массивов $_POST и $_FILES просто нет, как обрабатывать такие ошибки.

    Здравствуйте, Михаил! У меня вопрос: как сделать своё уникальное имя для каждого файла? То есть что бы не было такого, что бы два пользователя загрузили разные файлы с одинаковым именем.

    Генерировать это имя в PHP, например, используя это: http://myrusakov.ru/php-uniqid.html

    А может ли быть так, что функция uniqid вернет такой же ключ как и возвращал раньше?

    Чисто теоретически всё может быть, но на практике я думаю, что таких случаев не было.

    Загрузка нескольких файлов в php

    Я хочу загрузить несколько файлов и сохранить их в папке, а также получить путь и сохранить его в базе данных … Любой хороший пример, который вы искали для загрузки нескольких файлов …

    Примечание. Файлы могут быть любого типа …

    Я знаю, что это старый пост, но некоторые дополнительные объяснения могут быть полезны для тех, кто пытается загрузить несколько файлов … Вот что вам нужно сделать:

    • Имя входа должно быть определено как массив, то есть name = “inputName []”
    • Элемент ввода должен иметь несколько = «несколько» или просто несколько
    • В вашем файле PHP используйте синтаксис «$ _FILES [‘inputName’] [‘param’] [index]”
    • Убедитесь, что вы ищете пустые имена файлов и пути , массив может содержать пустые строки . Используйте array_filter () перед подсчетом.

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

    Надеюсь, это поможет!

    Несколько файлов можно выбрать, а затем загрузить с помощью

    Пример скрипта php, который выполняет загрузку:

    Выбранные файлы принимаются как массив с

    $_FILES[‘file’][‘name’][0] сохранение имени первого файла.
    $_FILES[‘file’][‘name’][1] сохранение имени второго файла.
    и так далее.

    HTML

    создать div с id=’dvFile’ ;

    onclick этой функции вызова кнопки add_more()

    JavaScript

    PHP

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

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

    теперь у вас есть общее количество файлов.

    В цикле while сделайте так:

    Это не отличается от загрузки одного файла – $_FILES – это массив, содержащий все и все загруженные файлы.

    В руководстве по PHP есть глава: Загрузка нескольких файлов

    Если вы хотите включить несколько загрузок файлов с легким выбором в конце пользователя (выбор нескольких файлов одновременно, а не заполнение полей загрузки), посмотрите SWFUpload . Он работает иначе, чем обычная форма загрузки файлов, и требует Flash для работы. SWFUpload был устаревшим вместе с Flash. Проверьте другие, более новые ответы для правильного подхода.

    Вот функция, которую я написал, которая возвращает более понятный массив $_FILES .

    Я запускаю цикл foreach с элементом ошибки, выгляжу как

    Просто наткнулся на следующее решение:

    это готовый PHP Multi File Upload Script с формой, где вы можете добавить несколько входов и индикатор выполнения AJAX. Он должен работать сразу после распаковки на сервере …

    Читать еще:  Как уменьшить время загрузки Windows 10?

    Мы можем легко загрузить несколько файлов с помощью php, используя приведенный ниже скрипт.

    Скачать полный исходный код и предварительный просмотр

    Хорошая ссылка на:

    PHP Single File Uploading с различными базовыми объяснениями .

    Загрузка файла PHP с помощью проверки

    Загрузка нескольких файлов PHP с проверкой Нажмите здесь, чтобы скачать исходный код

    PHP / jQuery Загрузка нескольких файлов с помощью ProgressBar и проверки (нажмите здесь, чтобы загрузить исходный код)

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

    и вы должны проверить свой HTML-код

    Хорошая ссылка на:

    PHP Single File Uploading с различными базовыми объяснениями .

    Загрузка файла PHP с помощью проверки

    Загрузка нескольких файлов PHP с проверкой Нажмите здесь, чтобы скачать исходный код

    PHP / jQuery Загрузка нескольких файлов с помощью ProgressBar и проверки (нажмите здесь, чтобы загрузить исходный код)

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

    Блог Александра Денисюка

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

    §1. Общие принципы

    Всю последовательность загрузки изображения на сервер можно отобразить следующим образом: настройка php.iniполучение файлапроверка безопасностивалидация данныхсохранение на диск. Процесс загрузки картинки с компьютера пользователя или по URL ничем не отличаются, за исключением способа получения изображения и его сохранения. Общая схема загрузки картинки на сервер выглядит следующим образом:

    Для валидации картинки по URL мы будем использовать функцию getimagesizefromstring(), т. к. cURL скачает её в переменную для дальнейших манипуляций.

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

    §2. Правила безопасности

    Безопасность загрузки изображений сводится к недопущению попадания на сервер чужеродного кода и его выполнения. На практике загрузка картинок наиболее уязвимое место в PHP-приложениях: попадание shell-скриптов, запись вредоносного кода в бинарные файлы, подмена EXIF-данных. Для того, чтобы избежать большинства методов взлома нужно придерживаться следующих правил:

    §3. Конфигурация php.ini

    PHP позволяет внести определённые конфигурационные значения в процесс загрузки любых файлов. Для этого необходимо в файле php.ini найти блоки «Resource Limits», «Data Handling» и «File Uploads», а затем отредактировать, по необходимости, следующие значения:

    Исходя из указанных значений, пользователь не сможет за один раз загрузить больше десяти файлов, причём каждый файл не должен превышать 5 Мбайт. Параметры из блока «Resource Limits» больше нужны для загрузки удалённого файла, т. к. с помощью cURL мы будем скачивать содержимое в переменную и проверять её по нужным нам критериям, а для этого необходимо дополнительное время и память.

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

    §4. Загрузка картинок из формы

    Сейчас мы не будем рассматривать загрузку нескольких файлов на сервер, а разберём лишь саму механику загрузки на примере одного файла. Итак, для загрузки картинки с компьютера пользователя необходимо с помощью HTML-формы отправить файл PHP-скрипту методом POST и указать способ кодирования данных enctype=”multipart/form-data” (в данном случае данные не кодируются и это значение применяется только для отправки бинарных файлов). С формой ниже мы будем работать дальше:

    Для поля выбора файла мы используем имя name=”upload” в нашей HTML-форме, хотя оно может быть любым. После отправки файла PHP-скрипту file-handler.php его можно перехватить с помощью суперглобальной переменной $_FILES[‘upload’] с таким же именем, которая в массиве содержит информацию о файле:

    Не всем данным из $_FILES можно доверять: MIME-тип и размер файла можно подделать, т. к. они формируются из HTTP-ответа, а расширению в имени файла не стоит доверять в силу того, что за ним может скрываться совершенно другой файл. Тем не менее, дальше нам нужно проверить корректно ли загрузился наш файл и загрузился ли он вообще. Для этого необходимо проверить ошибки в $_FILES[‘upload’][‘error’] и удостовериться, что файл загружен методом POST с помощью функции is_uploaded_file(). Если что-то идёт не по плану, значит выводим ошибку на экран.

    Для того, чтобы злоумышленник не загрузил вредоносный код встроенный в изображение, нельзя доверять функции getimagesize(), которая также возвращает MIME-тип. Функция ожидает, что первый аргумент является ссылкой на корректный файл изображения. Определить настоящий MIME-тип картинки можно через расширение FileInfo. Код ниже проверит наличие ключевого слова image в типе нашего загружаемого файла и если его не окажется, выдаст ошибку:

    На данном этапе мы уже можем загружать абсолютно любые картинки на наш сервер, прошедшие проверку на MIME-тип, но для загрузки изображений по определённым характеристикам нам необходимо валидировать их с помощью функции getimagesize(), которой скормим сам бинарный файл $_FILES[‘upload’][‘tmp_name’]. В результате мы получим массив максимум из 7 элементов:

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

    После всех проверок мы можем с уверенностью переместить наш загружаемый файл в какую-нибудь папку с картинками. Делать лучше это через функцию move_uploaded_file(), которая работает в безопасном режиме. Перед перемещением файла нельзя забыть сгенерировать случайное имя и расширение из типа изображения для нашего файла. Вот так это выглядит:

    На этом загрузка изображения завершена. Для более удобной загрузки файлов можете использовать класс UploadedFile из пакета Symfony HttpFoundation, который является обёрткой для $_FILES и также сохраняет файл через move_uploaded_file().

    §5. Загрузка изображения по ссылке

    Для загрузки изображения по ссылке нам понадобиться библиотека cURL, которая работает с удалёнными ресурсами. С помощью неё мы скачаем контент в переменную. С одной стороны может показаться, что для этих целей подойдёт file_get_contents(), но на самом деле мы не сможем контролировать объём скачиваемых данных и нормально обрабатывать все возникшие ошибки. Для того, чтобы cURL корректно скачал данные нам нужно: разрешить следовать перенаправлениям, включить проверку сертификата, указать максимальное время работы cURL (формируется за счёт объёма скачиваемых данных и средней скорости работы с ресурсом). Как правильно скачать файл в переменную показано ниже с необходимыми параметрами:

    Если всё прошло успешно и cURL уложился в 60 секунд, тогда содержимое по ссылке будет скачано в переменную $raw. Кроме того, функция curl_getinfo() вернёт информацию о проделанном запросе, откуда мы можем получить дополнительную информацию для анализа работы с удалёнными ресурсами:

    Дальше нам нужно проверить нет ли ошибок в curl_errno() и удостовериться, что ресурс отдаёт HTTP-код равный 200, иначе мы скажем, что по такому-то URL ничего не найдено. После всех проверок переменную $raw передаём в getimagesizefromstring() и работаем уже по отработанной схеме как в случае с загрузкой картинок из формы.

    Для сохранения изображения на диск можно воспользоваться file_put_contents(), которая запишет контент в файл. Новое имя файла мы создадим через функцию md5(), а расширение сделаем из image_type_to_extension(). Теперь мы можем загружать любые картинки по ссылке.

    §6. Настройка выбора нескольких файлов

    В этом параграфе разберём способы загрузки нескольких изображений за один раз с локальной машины пользователя и по удалённым ссылкам. Для отправки ссылок мы задействуем $_POST и передадим ей все данные с помощью тега textarea. Для загрузки файлов из формы мы продолжим дальше работать с $_FILES. Наша новая HTML-форма будет немного отличаться от старой.

    В конец имени поля выбора файла name=”upload[]” добавились фигурные скобки и аттрибут multiple, который разрешает браузеру выбрать несколько файлов. Все файлы снова загрузятся во временную папку, если не будет никаких ошибок в php.ini . Перехватить их можно в $_FILES, но на этот раз суперглобальная переменная будет иметь неудобную структуру для обработки данных в массиве. Решается эта задача небольшими манипуляциями с массивом:

    Для загрузки нескольких картинок по URL передадим наши ссылки через textarea с именем name=”upload”, где их можно указать через пробел или с новой строки. Функция preg_split разберёт все данные из $_POST[‘upload’] и сформирует массив, по которому нужно пройтись циклом и каждый валидный URL отправить в обработчик.

    Вы можете улучшить форму для загрузки изображений, например, воспользоваться библиотекой FineUploader или jQuery FileUpload, чтобы настроить выбор картинок с определённым расширением.

    голоса
    Рейтинг статьи
    Ссылка на основную публикацию
    Статьи c упоминанием слов: