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

Одновременная загрузка файлов и данных формы через Ajax

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

Понадобилось сделать достаточно очевидную, казалось бы, вещь — страничку, на которой можно заполнить несколько полей формы, выбрать несколько файлов и при нажатии на кнопку чтобы всё это вместе отправлялось на сервер без перезагрузки страницы (через ajax).Оказалось, что есть ряд ньюансов. По отдельности нет проблем, а чтобы всё вместе — начинаются сложности.

В итоге всё заработало, так что предлагаю простой пример.После успешной загрузки сервер возвращает содержимое массивов _POST и _FILES, которое выводится на ту же страницу.Проверял в Windows версиях FF, Chrome, IE, Opera, а также в Android Chrome и старом Android Browser.  Под IOS не проверял — нет под рукой.

Не работает в Safari 5.34/Win.

Причина непонятна (симптомы — отправляет файлы нулевой длины).

Не будет работать в IE

Код сервера (php):

cr_itПрошло три года с момента покупки HTC Desire и вот, наконец, я решил сменить телефон. Честно говоря, пользовался бы старым и дальше — он мне до сих пор очень нравится и отлично работает. Основная проблема — память (RAM) — её стало катастрофически не хватать. Вдобавок, постепенно начинают появляться приложения, работающие только на новых версиях Android. К примеру, Google для своего Google Keep сделал виджет, работающий принципиально только под 4.x.  И всё равно пришлось себя долго уговаривать в необходимости смены телефона 🙂 Уговорил…

ВЫБОРНа что менять? Вопрос оказался весьма непростым. Понятно, что рассматривался только Android. Второе принципиальное ограничение — размеры должны быть не больше, чем у HTC Desire. Ну и конечно телефон должен быть мощный — иначе какой смысл вообще заморачиваться с заменой.

Также, в нём нужны какие-нибудь полезные особенности, чтобы проще было себя уговорить на покупку.

Как несложно догадаться, основная проблема возникла с размерами. Все телефоны которые более-менее нравились — лопаты. Ну просто все. Мне вот понравился HTC One.

Сам он — здоровая лопата, однако они выпустили еще HTC One Mini, который по размерам не совсем Mini и, вдобавок, сильно урезан по функционалу и слабо — по цене.

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

В итоге, нашёлся один более или менее устраивающий меня телефон — Motorola Droid Mini. Продающийся, замечу, только в США (соответственно, LTE только американское). Весьма показательно что, судя по единичным местам где его можно было купить в онлайне и довольно приличной цене за разлоченный вариант — спрос на него велик (что не удивляет, учитывая описанную выше ситуацию).

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

ВПЕЧАТЛЕНИЯ

Все характеристики я перечислять не буду — можете сами посмотреть.

Остановлюсь на некоторых существенных особенностях:

Во-первых, несмотря на размер (почти такой же, как у HTC Desire) он не является урезанной версией своего лопатообразного большого брата (Motorola Droid Maxx).

По большому счёту, это тот же телефон, просто меньше размером. Они даже умудрились в меньшем экране (который довольно большой, т.к. доходит до краёв, в отличие от HTC Desire) сохранить тоже разрешение, что и у Maxx — 1280×720.- Чрезвычайно полезная вещь — так называемые Active Notifications. В спящем режиме телефон постоянно следит в каком положении находится. Если его вытащить из кармана, через секунду показывает время и наличие уведомлений.

Читайте также  Почему при скачивании файла пишет загрузка прервана?

Соответственно, без разлочивания телефона одним движением можно посмотреть, какая почта/SMS пришли.Интересно что, судя по всему, определяют доставание из кармана только акселерометрами. Ну может еще телефон смотрит на освещённость, когда в кармане лежит.С этими Active Notifications есть интересный момент — в Droid Maxx экран AMOLED. И поэтому там при показе уведомлений на маленьком участке в середине экрана включается только та часть светодиодной матрицы, которая нужна.Но в Droid Mini экран LCD.

Поэтому подсветка включается всегда для всего экрана и никакой экономии электричества от показа информации на маленьком участке — нет.В связи с этим вроде как есть отличия в логике работы Active Notifications. Может даже в Maxx'e они светятся всегда, хотя точно не знаю — меня Maxx не интересовал.- Телефон умеет включать камеру по встряхиванию (не любому, а резкому и довольно специфическому — грамотно продумано).

— Интересная (но практически бесполезная) возможность: даже в спящем состоянии телефон постоянно прислушивается, не скажет ли владелец фразу «OK, Google». Под это они туда отдельный спецпроцессор добавили, так что энергопотребление возрастает несущественно. Как только услышит фразу (предварительно его нужно один раз обучить чтобы голос узнавал), запускает Google Now. Ну и, соответственно, можно спросить время, погоду, можно запустить любое приложение, поискать что-то в Google Search.

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

Замечу, что если телефон залочен кодом или жестом, пока не разлочишь пальцами — команд он выполнять не будет. Распознавалку можно переключить на русский язык, но по-моему в этом случае всё сказанное рассматривается в контексте «Искать в Google».- Вторая очень полезная и правильная вещь (помимо Active Notifications) — беспроводная зарядка стандарта Qi.

Непонятно, почему до сих пор беспроводные зарядки не пользуются большой популярностью (та же Motorola не делает никакого акцента на них и не предлагает зарядку в числе аксессуаров) — это же очень удобно. Чем попадать в разъем microUSB — просто положил телефон на площадку, а утром взял…

Я купил такую.

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

— Ну и ещё коротко: 2GB RAM, NFC, BT4, nanoSIM. Android 4.2.2 (официально обещан update как минимум до 4.4). Надстроек над чистым Android'ом — минимум. Т.е. ничего похожего на HTC Sense и т.п. тут нет.- Понятно, что во всех меню язык английский. Однако писать по-русски конечно можно. И распознавание речи переключается на русский.- USB host работает (нужен USB OTG кабель). Опробована флэшка — она видна в «storage/usbdisk_1.1.1/». Клавиатура не видится. Возможно, не хватает питания.- На сколько хватает заряда? Да как обычно у Android'ов — на рабочий день точно хватает. Я бы сказал, что работает в полтора раза дольше HTC Desire (при аналогичном использовании).Из недостатков:- Как я уже сказал, LTE только американский. У нас и в Европах диапазоны LTE другие, так что работает только GPRS/Edge/3G. Да и ладно. Честно говоря, и у 3G-то до сих пор, мягко говоря, не идеальное покрытие. А уж пока раскрутят LTE…- Отсутствие физических кнопок home/search/back. Напрягает, но тут уже без вариантов — производители разом радостно упростили и удешевили конструкцию, попутно повысив надёжность (спасибо хоть включение и громкость пока оставили).- Скользкий (глянец со всех сторон). Причем, раньше у них эти кевларовые корпуса не были глянцевыми — они специально его чем-то покрыли в этой модели. Типа «народ хочет, чтобы блестело — ну ок, пусть подавится» :)- Камера плохая (для телефона такого уровня в 2013 году — просто ужасная, я бы сказал). При плохом освещении включаются агрессивные шумодавные фильтры и от изображения мало что остаётся. При съёмке видео электронный (не оптический) стабилизатор делает видео странно дёрганным. Ну т.е. как бы имеем два варианта — или изображение неподвижно стоит или дёргается 🙂 На можно посмотреть всякие примеры — это хорошо видно. И экспозиция меняется заметными ступеньками.- Аккумулятор сменить нельзя, сменных карт памяти тоже нет.

Читайте также  0xc0000034 Windows 7 при загрузке

Общее резюме — несмотря на перечисленные недостатки, телефон годный. Как современная замена HTC Desire — вполне меня устроил.

UPDATE: USB host всё же работает и без рута. Опробована флэшка — она видна в «storage/usbdisk_1.1.1/» (и почему-то только там).

UPDATE2: С пришедшим update'ом Android'a до KitKat, usb host в нормальном виде работать перестал. Т.е. втыкание флэшки через otg переходник не делало её автоматически доступной в файловой системе. Проблему пришлось решать специальной софтиной (очень неплохой, кстати).

Page 3

cr_it

Другие видео (в т.ч. интервью с участниками выставки исторических компьютеров) здесь. Фото можно найти здесь.

Различные новости и заметки о Chaos Constructions (начиная с самых первых лет) — http://enlight.ru/cc

История Chaos Constructions и ENLiGHT: http://cc.org.ru

Источник: https://cr-it.livejournal.com/28792.html

Загрузка файлов (картинок) на сервер через AJAX и jQuery

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

Как загружать любые файлы, например, картинки на сервер с помощью AJAX и jQuery? Делается это довольно просто! И ниже мы все обстоятельно разберем.

В те «древние» времена, когда еще не было jQuery, а может он был, но браузеры были не так наворочены, загрузка файла на сайт с помощью AJAX была делом муторным: через всякие костыли вроде iframe. Я те время не застал, да и кому это теперь интересно. А интересно теперь другое — что сохранение файлов на сайт делается очень просто.

Даже не обладающий опытом и пониманием, того как работает AJAX, вебмастер, сможет быстро разобраться что-куда. А эта статья ему в помощь. Если подкрепить эти возможности функциями WordPress, то безопасная обработка и загрузка файлов на сервер становится совсем плевым и даже интересным делом (пример с WordPress смотрите в конце статьи).

Однако, как бы все просто не было, нужно заметить, что минимальный опыт работы с файлами и базовые знания в Javascript, jQuery и PHP все же необходимы! Минимум, нужно представлять как загружаются файлы на сервер, как в общих чертах работает AJAX и хоть немного надо уметь читать и понимать код.

Описанный ниже метод довольно стабилен, и по сути опирается на Javascript объект new FormData(), базовая поддержка которого есть во всех браузерах.

Для более понятного восприятия материала, он разделен на шаги. На этом все, полетели…

плагин для упрощения работы с AJAX в WordPress.

AJAX Загрузка файлов: общий пример

Начинается все с наличия на сайте input поля типа file. Нет необходимости, чтобы это поле было частью формы (тега ).

Таким образом, у нас есть HTML код с file полем и кнопкой «Загрузить файлы».

Загрузить файлы

Шаг 1. Данные из поля file

Первым шагом, нужно получить данные загружаемых файлов.

Читайте также  Как сменить экран загрузки Windows 7?

При клике на file-поле, появляется окно выбора файлов, после выбора, данные о них сохраняются в input поле, а нам нужно их от туда «забрать». Для этого повесим на событие change JS функцию, которая будет сохранять имеющиеся данные file-поля в JS переменную files:

var files; // переменная. будет содержать данные файлов // заполняем переменную данными, при изменении значения поля file $('input[type=file]').on('change', function(){ files = this.files;});

Шаг 2. Создаем AJAX запрос (по клику)

Данные файлов у нас есть, теперь их нужно отправить через AJAX. Вешаем это событие на клик по кнопке «Загрузить файлы».

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

Далее, из имеющихся данных формы создаем нестандартный AJAX запрос, в котором передаем файлы в стандартном для сервера формате: $_FILES.

Чтобы такой запрос состоялся, в jQuery нужно указать дополнительные AJAX параметры, поэтому привычная функция $.post() не подходит и мы используем более гибкий аналог: $.ajax().

Два важных дополнительных параметра нужно установить в false:

processDataОтключает обработку передаваемых данных. По умолчанию, например, для GET запросов jQuery собирает данные в строку запроса и добавляет эту строку в конец URL. Для POST данных делает другие преобразования. Нам любые изменения исходных данных будут мешать, поэтому отключаем эту опцию…contentTypeОтключает установку заголовка типа запроса. Дефолтная установка jQuery равна «application/x-www-form-urlencoded. Такой заголовок не предусматривает отправку файлов. Если установить этот параметр в «multipart/form-data», PHP все равно не сможет распознать передаваемые данные и выведет предупреждение «Missing boundary in multipart/form-data»… В общем, проще всего отключить эту опция, тогда все работает!// обработка и отправка AJAX запроса при клике на кнопку upload_files$('.upload_files').on( 'click', function( event ){ event.stopPropagation(); // остановка всех текущих JS событий event.preventDefault(); // остановка дефолтного события для текущего элемента — клик для тега // ничего не делаем если files пустой if( typeof files == 'undefined' ) return; // создадим объект данных формы var data = new FormData(); // заполняем объект данных файлами в подходящем для отправки формате $.each( files, function( key, value ){ data.append( key, value ); }); // добавим переменную для идентификации запроса data.append( 'my_file_upload', 1 ); // AJAX запрос $.ajax({ url : './submit.php', type : 'POST', // важно! data : data, cache : false, dataType : 'json', // отключаем обработку передаваемых данных, пусть передаются как есть processData : false, // отключаем установку заголовка типа запроса. Так jQuery скажет серверу что это строковой запрос contentType : false, // функция успешного ответа сервера success : function( respond, status, jqXHR ){ // ОК — файлы загружены if( typeof respond.error === 'undefined' ){ // выведем пути загруженных файлов в блок '.ajax-reply' var files_path = respond.files; var html = ''; $.each( files_path, function( key, val ){ html += val +'
'; } ) $('.ajax-reply').html( html ); } // ошибка else { console.log('ОШИБКА: ' + respond.data ); } }, // функция ошибки ответа сервера error: function( jqXHR, status, errorThrown ){ console.log( 'ОШИБКА AJAX запроса: ' + status, jqXHR ); } }); }); меню

Шаг 3. Обрабатываем запрос: загружаем файлы на сервер

Теперь последний шаг: нужно обработать отправленный запрос.

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

Создадим файл submit.php с таким кодом (предполагается что submit.php лежит в той же папке, где и файл, с которого отправляется AJAX запрос):

Источник: https://wp-kama.ru/id_9026/jquery-ajax-zagruzka-fajlov-na-server.html