22.01.2018, 05:44
|
|
Аспирант
|
|
Регистрация: 18.03.2016
Сообщений: 69
|
|
Как в html форме вместе с файлом передать переменную
Всем доброго времени суток.
Имеется форма по загрузке фото на сервер.
Есть обработчик кода ajaxImageUpload.php
Форма отправляет файл во временную папку сервера, передавая его параметры в файл-обработчик ajaxImageUpload.php.
В обработчике, я манипулирую с полученным файлом и получаю результирующую строку:
echo "<img src='.........'>";
А мне надо получить
echo "<img id="img_1212343" src='.........'>";
. То есть, вместе с файлом я должен передать его ID. Обработчик добавляет файл на сервер в нужное место, делает запись в БД о данном файле, используя ID. И выдает мне мой код: echo "<img id="img_ID" src='.........'>";
Можно ли в этой форме передать еще переменную с номером, вместе с файлом?
<form id="imageform" method="post" enctype="multipart/form-data" action='ajaxImageUpload.php' style="clear:both">
<h1>Загрузка изображений</h1>
<div id='imageloadstatus' style='display:none'><img src="loader.gif" alt="Загрузка ..."/></div>
<div id='imageloadbutton'>
<input type="file" name="photos[]" id="photoimg" multiple="true" />
</div>
</form>
</div>
|
|
22.01.2018, 06:06
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от kupidon
|
То есть, вместе с файлом я должен передать его ID. Обработчик добавляет файл на сервер в нужное место, делает запись в БД о данном файле, используя ID.
|
Если данные о загруженном файле пишутся в БД, то каким образом их ID могут оказаться на клиенте если записи в БД еще не было?
Вы загружаете на сервер не одно изображение, а несколько. Пусть эти изображения принадлежат владельцу с ID 15. ID владельца можно добавить в форму скрытым полем, а можно и как индекс в имени поля, если кроме передачи файлов отправляются и другие POST данные. Если только загрузка файлов, то можно так - name="photos[15]".
Получив файлы сервер записывает информацию о них для владельца ID 15, формируя их идентификаторы (средствами SQL), которые после записи можно получить, и только после чего их можно использовать.
|
|
22.01.2018, 09:45
|
|
Аспирант
|
|
Регистрация: 18.03.2016
Сообщений: 69
|
|
Спасибо за ответ. Чтобы обратиться к БД мне и нужно передать значения в файл.
Могу я добавить в форму скрытое поле?
например
<input name="purch" value="'.$2121212.'" type="hidden">
Сможет обработчик принять его? То есть в обработчик приедет и параметры файла и значение purch ?
|
|
22.01.2018, 10:52
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от kupidon
|
Чтобы обратиться к БД мне и нужно передать значения в файл
|
О чем речь? Если о добавлении новых изображений, то как они могут оказаться в БД раньше, чем будут загружены на сервер? Если редактирование существующих изображений принадлежащих кому либо, то да, можно и нужно получать их идентификаторы. Но в этом случае поле выбора каждого из этих изображений не может быть multiple.
|
|
22.01.2018, 11:22
|
|
Аспирант
|
|
Регистрация: 18.03.2016
Сообщений: 69
|
|
Речь об интернет магазине. Открываю страницу редактирования товара, добавляю изображения согласно Id товара. У каждого товара их может быть несколько. Фото отлично загружаются на сервер по несколько штук. В обработчике , циклом foreach , я делаю им ресайз, уникальное имя и отправляю каждый файл в нужную папку. В обработчике все это уже сделал. Осталось в обработчике получить id товара, то есть его получить одновременно вместе с файлами, чтобы прописать загруженные фотографии в БД к нужному товару.
Надеюсь не запутал))
|
|
22.01.2018, 13:58
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Не важно что является владельцем, товар ли, статья и прочее, важно формирование связей. Пусть товары, и в таблице их описывающей товары получают уникальный идентификатор - первичный ключ с автоинкрементом.
Прежде чем определять структуру таблицы содержащую информацию об изображениях товаров нужно определиться со структурой каталога хранящего эти изображения. Если товаров много и скинуть все их изображения в одну папку, то работать с такой папкой будет трудно - файловые операции медленные и чем больше загружена файлами директория, тем медленнее будут эти процессы.
То есть, если структура каталога хранящего изображения разбита например на категории товаров, то таблица описывающая изображения помимо ссылки на товар и его изображение, также должна ссылаться и на категорию товара.
Непосредственно ссылка на товар может быть числовым значением - первичным ключом с автоинкрементом, а может быть и именем. Во втором случае уникальность имени изображения и id товара должны быть обеспечены только в пределах категорий товаров - уникальным индексом будет составной индекс "id категории, id товара, имя изображения".
Пусть для простоты все хранится в куче и таблица изображений хранит id изображения формирующихся автоматически при записи в таблицу, и id товара.
Форма для добавления нового товара в базу и редактирования существующего в базе товара может быть одна и та же. Отличие форм только в наличии идентификатора - при добавлении товара он не передается формой, при редактировании присутствует в форме - скрытое поле.
Работа над ошибками
В процессе добавления/редактирования возможны ошибки как в данных так и в загружаемых файлах. Сервер обязан проверять данные поступающие извне и возвращать клиенту ошибки. Загрузка файлов на сервер, это и большой объем данных, и длительный процесс. При этом, если файлы загружены без ошибок, а данные формы имеют ошибки, то повторное отправление формы после устранения ошибок также будет производиться с повторной загрузкой файлов на сервер. Чтобы избежать повторной загрузки, загруженные без ошибок и обработанные без ошибок файлы (изменение размеров, обрезка и т.п.) можно сохранить в сессии. Клиенту возвращается отчет об ошибках, включая и ошибки о загрузке/обработке файлов, а поле/поля выбора файла сбрасываются. Клиент может повторить выбор и загрузку только тех файлов, которые были загружены или обработаны с ошибками.
После удачного добавления/обновления товара файлы из сессии перемещаются в каталог.
Добавление нового товара
После удачного добавления информации о товаре, в таблицу товаров делается запрос на получение ID последней записи - идентификатора присвоенного товару. Производится запись в базу загруженных изображений с одновременным их перемещением в каталог - процесс нужно начинать с перемещения изображения в каталог, а запись в базу производить при отсутствии ошибки перемещения. В случае именования/хранения в этой таблице имен изображений как уникальных идентификаторов, добавление изображений в базу можно производить только циклом, так как после каждого добавления потребуется запрос на получение ID добавленного фото.
Если в таблице изображений формируемый уникальный идентификатор является не именем изображения, а идентификатором записи (однозначно указывает на индекс "id категории, id товара, имя изображения"), то добавления изображений в таблицу можно произвести одним запросом много-строчной вставкой. Имена изображений при этом формируются при обработке и сохранения изображений, а получение ID записи не требуется. Запись в изображений в базу нужно производить после успешного перемещения изображений в каталог, соответственно с обработкой ошибок.
В таблицу пишется и ранее полученный идентификатор товара.
Поле для загрузки изображений именуется как name="name_field[0][]". Поле с множественным выбором.
Редактирование товара
Форма имеет скрытое поле содержащее идентификатор товара.
Можно одновременно редактировать имеющиеся изображения (удалять их, замещая новыми) и добавлять новые.
Как и в случае добавления товара новые изображения можно загружать полем name="name_field[0][]" с множественным выбором. Поля редактирования имеющихся изображений при этом именуются как name="name_field[ID]", где ID - идентификатор изображения/записи. Этим полем можно выбрать только один файл. Также такое поле можно добавлять в форму только по требованию.
Сервер при получении файлов руководствуется индексом ключа name_field - если 0, то добавление новых изображений, если отлично от нуля, то замена старого изображения на новое. При замещении старого изображения новым нужно получить имя этого изображения в базе и после удачного его удаления, и замещения новым, произвести запись нового в базу.
Все остальные принципы обновления в базе такие же как и при добавлении, отличаются только операции - при обновлении ID уже известен.
Вот такие общие принципы могут быть.
Последний раз редактировалось laimas, 22.01.2018 в 14:21.
|
|
22.01.2018, 14:22
|
|
Аспирант
|
|
Регистрация: 18.03.2016
Сообщений: 69
|
|
Спасибо Вам за столько огромный ответ. Неожиданно.
Сейчас с работы приеду и буду пережевывать.
|
|
22.01.2018, 14:55
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от kupidon
|
Неожиданно
|
Что в этом неожиданного?
Вообще место вашей темы скорее всего должно быть не в этом разделе, ибо на 99% все вопросы ее затрагивающие должен решать сервер. Главное же в данном вопросе, это как связаны данные, структура их (каталоги). Если этот вопрос у вас будет иметь "слабые места", то гарантированно, что рано или поздно у вас появятся проблемы.
Если бы речь была к примеру о добавлении изображений к статье и не просто "притулить", а разместить их в статье, тогда бы ваша тема более тяготела бы к данному разделу.
Пусть не имеется визуального редактора и оперируя полем textarea хочется отформатировать текст как статью с "красивой" вставкой в нее изображений: как есть; указать обтекание текстом; указать размер.
Заголовок статьи передается отдельным полем, а на параграфы разбиваться текст будут по условию - два подряд перевода строки определяют параграфы. Обтекание справа/слева задается именами классов. Размер изображения определяется оценочно, исходя из известной ширины элемента отображающего статью на странице.
В этом случае все, включая и связь добавляемого в статью изображения с местоположением его на странице, будет решаться клиентом. Добавление изображения, это добавление поля file в форму, которое получает в имени индекс по приращению. Этот же индекс добавляется ВВ-тегу [IMG], связывая изображение в тексте с загружаемым изображением. С этим же тегом связывается обтекание, если оно задается, и размер, ели он изменяется. Изменение размера, которые нужно указать и передать на сервер, можно решить оперируя исключительно стилем - указывать ширину/высоту, рассчитывая процентное изменение от исходного размера ширины или высоты.
Серверу останется только сделать разбор текста, загружать изображения, заменяя в тексте ВВ-тег связанный с каждым ссылкой на загруженное.
Последний раз редактировалось laimas, 22.01.2018 в 14:58.
|
|
|
|