Obecnie mam formularz HTML, w którym użytkownicy wpisują szczegóły ogłoszenia, które chcą zamieścić. Chcę teraz móc dodać strefę zrzutu do przesyłania zdjęć przedmiotu na sprzedaż.
Znalazłem Dropzone.js, który wydaje się robić większość tego, czego potrzebuję. Jednak patrząc do dokumentacji wydaje się, że należy określić klasę całego formularza jako dropzone
(a nie tylko elementu wejściowego ). Oznacza to, że cała moja forma staje się strefą zrzutu .
Czy można użyć dropzone tylko w części mojego formularza, tj. Określając element tylko jako klasę „dropzone” , a nie cały formularz?
Mógłbym użyć oddzielnych formularzy, ale chcę, aby użytkownik mógł przesłać to wszystko za pomocą jednego przycisku.
Czy jest też inna biblioteka, która może to zrobić?
Wielkie dzięki
źródło
Miałem dokładnie ten sam problem i stwierdziłem, że odpowiedź Varana Sinayee była jedyną, która faktycznie rozwiązała pierwotne pytanie. Tę odpowiedź można jednak uprościć, więc oto prostsza wersja.
Kroki są następujące:
Utwórz normalny formularz (nie zapomnij o metodzie i argumentach typu enctype, ponieważ nie jest to już obsługiwane przez dropzone).
Umieść element div w środku z
class="dropzone"
(tak dołącza się do niego Dropzone) iid="yourDropzoneName"
(służy do zmiany opcji).Ustaw opcje Dropzone, aby ustawić adres URL, pod którym formularz i pliki zostaną opublikowane, dezaktywuj autoProcessQueue (więc dzieje się to tylko wtedy, gdy użytkownik naciśnie przycisk „Prześlij”) i zezwalaj na wielokrotne przesyłanie (jeśli tego potrzebujesz).
Ustaw funkcję init, aby używała Dropzone zamiast domyślnego zachowania po kliknięciu przycisku przesyłania.
Wciąż w funkcji init, użyj procedury obsługi zdarzeń „sendmultiple”, aby wysłać dane formularza wraz z plikami.
Voilà! Możesz teraz pobrać dane tak, jak w normalnym formularzu, w $ _POST i $ _FILES (w przykładzie stanie się to w pliku upload.php)
HTML
JS
źródło
processQueue()
rozmowie telefonicznej? Próbuję użyćsubmit()
lubclick()
oba nie działają.$(":input[name]", $("form")).each(function () { formData.append(this.name, $(':input[name=' + this.name + ']', $("form")).val()); });
(przepraszam, nie wiem, jak tutajNajpopularniejszą biblioteką do przesyłania obrazów jest „dropzone.js”. Jeśli chcesz, aby plik „dropzone.js” był tylko częścią formularza, wykonaj następujące czynności:
1) po stronie klienta:
HTML:
JQuery:
2) po stronie serwera:
ASP.Net MVC
źródło
Samouczek Enyo jest doskonały.
Zauważyłem, że przykładowy skrypt w samouczku działał dobrze w przypadku przycisku osadzonego w strefie dropzone (tj. Element formularza). Jeśli chcesz mieć przycisk poza elementem formularza, udało mi się to zrobić za pomocą zdarzenia click:
Po pierwsze, HTML:
Następnie tag script ....
źródło
W związku z tym, co mówił sqram, Dropzone ma dodatkową nieudokumentowaną opcję „hiddenInputContainer”. Wszystko, co musisz zrobić, to ustawić tę opcję na selektor formularza, do którego chcesz dołączyć ukryte pole pliku. I voila! Pole pliku „.dz-hidden-input”, które Dropzone normalnie dodaje do treści, w magiczny sposób przenosi się do formularza. Bez zmiany kodu źródłowego Dropzone.
Teraz, gdy to działa, aby przenieść pole pliku Dropzone do formularza, pole nie ma nazwy. Musisz więc dodać:
do dropzone.js po tym wierszu:
wokół linii 547.
źródło
Mam do tego bardziej zautomatyzowane rozwiązanie.
HTML:
JavaScript:
Laravel:
Nie ma potrzeby wyłączania DropZone Discovery, a przesyłanie zwykłego formularza będzie mogło wysłać plik z innymi polami formularza za pośrednictwem standardowej serializacji formularza.
Ten mechanizm przechowuje zawartość pliku jako łańcuch base64 w ukrytym polu wejściowym, gdy jest on przetwarzany. Możesz go zdekodować z powrotem do łańcucha binarnego w PHP za pomocą standardowej
base64_decode()
metody.Nie wiem, czy ta metoda zostanie naruszona w przypadku dużych plików, ale działa z plikami ~ 40 MB.
źródło
Możesz zmodyfikować formData, przechwytując zdarzenie „send” ze swojej strefy dropzone.
źródło
Aby przesłać wszystkie pliki wraz z innymi danymi formularza w jednym żądaniu, możesz skopiować tymczasowe ukryte
input
węzły Dropzone.js do swojego formularza. Możesz to zrobić w ramachaddedfiles
obsługi zdarzeń:Oczywiście jest to obejście zależne od szczegółów implementacji. Powiązany kod źródłowy .
źródło
myDropzone.on("thumbnail", () => {})
zdarzeniem. Wykonywanie przetwarzania natychmiastowego"addedFile"
pliku może nadal być dostępneundefined
po uzyskaniu dostępu.files[]
ale jest puste bez względu na to, co robię. Jakieś pomysły? Robię to w Laravel, jeśli ma to znaczenie.Chcę wnieść tutaj odpowiedź, ponieważ ja również napotkałem ten sam problem - chcemy, aby element $ _FILES był dostępny jako część tego samego postu jako inny formularz. Moja odpowiedź opiera się na @mrtnmgs, jednak zwraca uwagę na komentarze dodane do tego pytania.
Po pierwsze: Dropzone publikuje swoje dane za pośrednictwem AJAX
Tylko dlatego, że używasz tej
formData.append
opcji, nadal oznacza to, że musisz zająć się działaniami UX - tj. To wszystko dzieje się za kulisami i nie jest typowym postem w formularzu. Dane są publikowane w Twoimurl
parametru.Po drugie: jeśli w związku z tym chcesz naśladować post formularza, będziesz musiał przechowywać opublikowane dane
Wymaga to kodu po stronie serwera do przechowywania
$_POST
lub$_FILES
w sesji, która jest dostępna dla użytkownika po załadowaniu innej strony, ponieważ użytkownik nie przejdzie do strony, na której odebrano opublikowane dane.Po trzecie: musisz przekierować użytkownika na stronę, na której te dane są przetwarzane
Teraz, gdy opublikowałeś swoje dane, zapisałeś je w sesji, musisz wyświetlić / wykonać je dla użytkownika na dodatkowej stronie. Musisz również wysłać użytkownika do tej strony.
Więc dla mojego przykładu:
[Kod Dropzone: używa Jquery]
źródło
To tylko kolejny przykład tego, jak możesz używać Dropzone.js w istniejącej formie.
dropzone.js:
Później w pliku umieściłem
Zakłada się, że masz element div o identyfikatorze
#botofform
, dzięki czemu podczas przesyłania możesz użyć nazw przesłanych plików.Uwaga: mój skrypt przesyłania zwrócił przesłaną nazwę pliku.jpeg dubbl, uwaga, trzeba również utworzyć skrypt czyszczący, który sprawdzi katalog przesyłania pod kątem nieużywanych plików i usuwa je ... jeśli w nie uwierzytelnionym formularzu interfejsu użytkownika :)
źródło
Oto moja próbka oparta na Django + Dropzone. Widok ma zaznaczenie (wymagane) i przesłanie.
źródło