В настоящее время у меня есть HTML-форма, которую пользователи заполняют детали объявления, которое они хотят опубликовать. Теперь я хочу, чтобы можно было добавить Dropzone для загрузки изображений предмета для продажи.
Я нашел Dropzone.js, который, кажется, делает большую часть того, что мне нужно. Однако при просмотре документации кажется, что вам нужно указать класс всей формы как dropzone
(в отличие от только элемента ввода ). Это значит, что вся моя форма становится зоной падения .
Можно ли использовать dropzone только в части моей формы, то есть, только указав элемент как класс "dropzone" , а не всю форму?
Я мог бы использовать отдельные формы, но я хочу, чтобы пользователь мог отправить все это одной кнопкой.
Кроме того, есть ли другая библиотека, которая может сделать это?
Большое спасибо
источник
У меня была точно такая же проблема, и я обнаружил, что ответ Варан Синаи был единственным, который действительно решил исходный вопрос. Этот ответ может быть упрощен, так что вот более простая версия.
Шаги:
Создайте нормальную форму (не забудьте метод и аргументы enctype, так как это больше не обрабатывается dropzone).
Поместите div с помощью
class="dropzone"
(вот как Dropzone присоединяется к нему) иid="yourDropzoneName"
(используется для изменения параметров).Задайте параметры Dropzone, чтобы задать URL-адрес, где будут публиковаться форма и файлы, деактивировать autoProcessQueue (так происходит только при нажатии пользователем кнопки «Отправить») и разрешить несколько загрузок (если вам это нужно).
Установите функцию init, чтобы использовать Dropzone вместо поведения по умолчанию при нажатии кнопки отправки.
Все еще в функции init используйте обработчик события «sendmultiple» для отправки данных формы вместе с файлами.
Вуаля! Теперь вы можете извлекать данные, как и в обычной форме, в $ _POST и $ _FILES (в примере это происходит в upload.php)
HTML
JS
источник
processQueue()
звонка? Я пытаюсь использоватьsubmit()
илиclick()
, оба не работают.$(":input[name]", $("form")).each(function () { formData.append(this.name, $(':input[name=' + this.name + ']', $("form")).val()); });
(извините, я не знаю, как поставить переносы здесь)«Dropzone.js» - самая распространенная библиотека для загрузки изображений. Если вы хотите, чтобы файл dropzone.js был частью вашей формы, вам следует выполнить следующие шаги:
1) для клиентской части:
HTML:
JQuery:
2) для серверной части:
ASP.Net MVC
источник
Учебник Enyo отлично.
Я обнаружил, что пример сценария в учебном пособии хорошо работает для кнопки, встроенной в рабочую зону (т. Е. Для элемента формы). Если вы хотите, чтобы кнопка находилась вне элемента формы, я смог выполнить ее, используя событие click:
Во-первых, HTML:
Затем тег сценария ....
источник
В дополнение к тому, что говорил sqram, в Dropzone есть дополнительная недокументированная опция «hiddenInputContainer». Все, что вам нужно сделать, это установить эту опцию на селектор формы, к которой вы хотите добавить поле скрытого файла. И вуаля! Поле «.dz-hidden-input», которое Dropzone обычно добавляет к телу, волшебным образом перемещается в вашу форму. Не изменять исходный код Dropzone.
Теперь, пока это работает, чтобы переместить поле файла Dropzone в вашу форму, поле не имеет имени. Так что вам нужно будет добавить:
в dropzone.js после этой строки:
вокруг линии 547.
источник
У меня есть более автоматизированное решение для этого.
HTML:
JavaScript:
Laravel:
Нет необходимости отключать DropZone Discovery, и обычная отправка формы сможет отправить файл с любыми другими полями формы через стандартную сериализацию формы.
Этот механизм сохраняет содержимое файла в виде строки base64 в скрытом поле ввода при его обработке. Вы можете декодировать его обратно в бинарную строку в PHP через стандарт
base64_decode()
метода.Я не знаю, будет ли этот метод скомпрометирован с большими файлами, но он работает с файлами ~ 40 МБ.
источник
Вы можете изменить formData, перехватывая событие 'send' из вашей зоны сброса.
источник
Чтобы отправить все файлы вместе с другими данными формы в одном запросе, вы можете скопировать
input
в форму временные скрытые узлы Dropzone.js. Вы можете сделать это вaddedfiles
обработчике событий:Очевидно, что это обходной путь, зависящий от деталей реализации. Связанный исходный код .
источник
myDropzone.on("thumbnail", () => {})
событием. Выполнение обработки"addedFile"
файла немедленно может быть выполненоundefined
при доступе.files[]
но оно не заполнено, независимо от того, что я делаю. Любые идеи? Делать это в Laravel, если это что-то меняет.Я хочу внести здесь ответ, поскольку я тоже столкнулся с той же проблемой - мы хотим, чтобы элемент $ _FILES был доступен как часть той же публикации, что и другая форма. Мой ответ основан на @mrtnmgs, однако отмечает комментарии, добавленные к этому вопросу.
Во-первых: Dropzone публикует свои данные через ajax
Тот
formData.append
факт, что вы используете эту опцию, по-прежнему означает, что вы должны выполнять действия UX - то есть все это происходит за кулисами и не является типичной формой публикации. Данные публикуются по вашемуurl
параметру.Во-вторых: если вы хотите имитировать форму сообщения, вам необходимо сохранить опубликованные данные
Для этого требуется код на стороне сервера для сохранения вашего сеанса
$_POST
или$_FILES
сеанса, который доступен пользователю при загрузке другой страницы, поскольку пользователь не будет переходить на страницу, на которой получены опубликованные данные.В-третьих: вам нужно перенаправить пользователя на страницу, где действуют эти данные
Теперь вы разместили свои данные, сохранили их в сеансе, вам нужно отобразить / выполнить действие для пользователя на дополнительной странице. Вам также необходимо отправить пользователя на эту страницу.
Итак, для моего примера:
[Код Dropzone: использует Jquery]
источник
Это просто еще один пример того, как вы можете использовать Dropzone.js в существующей форме.
dropzone.js:
Затем, позже в файл я положил
Это предполагает, что у вас есть div с id
#botofform
таким образом, что при загрузке вы можете использовать имена загруженных файлов.Примечание: мой скрипт загрузки возвратил дубликаты theuploadedfilename.jpeg, вам также потребуется создать сценарий очистки, который проверяет каталог загрузки на наличие файлов, которые не используются, и удаляет их ..if в внешнем интерфейсе без аутентификации :)
источник
Вот мой пример, основанный на Django + Dropzone. Просмотр имеет выбрать (обязательно) и отправить.
источник