Obecnie możemy przeciągać i upuszczać pliki do specjalnego kontenera i przesyłać je za pomocą XHR 2. Wiele na raz. Z paskami postępu na żywo itp. Bardzo fajne rzeczy. Przykład tutaj.
Ale czasami nie chcemy tyle chłodu. Co chciałbym to przeciągnij i upuść pliki - wiele naraz - do standardowego wejścia plik HTML : <input type=file multiple>
.
Czy to jest możliwe? Czy istnieje sposób na „wypełnienie” wejścia pliku odpowiednimi nazwami plików (?) Z upuszczenia pliku? (Pełne ścieżki plików nie są dostępne ze względów bezpieczeństwa systemu plików).
Czemu? Ponieważ chciałbym przesłać zwykły formularz. Dla wszystkich przeglądarek i wszystkich urządzeń. Przeciąganie i upuszczanie to po prostu stopniowe ulepszenie w celu ulepszenia i uproszczenia UX. multiple
Będzie tam standardowy formularz ze standardowym wejściem do pliku (+ atrybut). Chciałbym dodać rozszerzenie HTML5.
edytuj
Wiem, że w niektórych przeglądarkach możesz czasami (prawie zawsze) upuszczać pliki do samego wejścia. Wiem, że Chrome zwykle to robi, ale czasami kończy się to niepowodzeniem, a następnie ładuje plik na bieżącej stronie (duży błąd, jeśli wypełniasz formularz). Chcę, aby był odporny na błędy i przeglądarki.
źródło
input type="file" multiple
działały dobrze w SafariOdpowiedzi:
Poniższe działa w Chrome i FF, ale nie znalazłem jeszcze rozwiązania, które obejmuje również IE10 +:
Prawdopodobnie będziesz chciał użyć
addEventListener
lub jQuery (itp.), Aby zarejestrować swoje programy obsługi evt - to jest tylko dla zwięzłości.źródło
MSIE
,Trident/
(IE11) iEdge/
(IE12) ...fileInput.files = evt.dataTransfer.files;
. Safari i Chrome działają jednak dobrze.Zrobiłem na to rozwiązanie.
Pokaż fragment kodu
Funkcja „przeciągnij i upuść” dla tej metody działa tylko w przeglądarkach Chrome, Firefox i Safari. (Nie wiem, czy działa z IE10), ale w przypadku innych przeglądarek przycisk „Lub kliknij tutaj” działa dobrze.
Pole wprowadzania danych po prostu podążaj za myszą podczas przeciągania pliku po obszarze. Dodałem również przycisk.
Nieprzezroczystość odkomentowania: 0; wejście pliku jest widoczne tylko po to, abyś mógł zobaczyć, co się dzieje.
źródło
To jest sposób na zrobienie tego w HTML5 „DTHML”. Normalne dane wejściowe (które JEST czytane tylko, jak wskazał Ricardo Tomasi). Następnie, jeśli plik jest przeciągany, jest dołączany do formularza. Będzie to wymagało modyfikacji strony akcji, aby zaakceptować przesłany w ten sposób plik.
Jeszcze bardziej szefowe jest, jeśli możesz uczynić całe okno strefą upuszczania, zobacz Jak mogę wykryć zdarzenie przeciągania HTML5 wchodzące i wychodzące z okna, tak jak robi to Gmail?
źródło
input type=file
.value
właściwość najnowszym plikiem, za każdym razem, gdy przechodzisz przez pętlę fore?źródło
Teoretycznie można dodać element nakładający się na
<input/>
, a następnie użyć jegodrop
zdarzenia do przechwycenia plików (za pomocą interfejsu File API) i przekazania ich dofiles
tablicy wejściowej .Tyle tylko, że plik wejściowy jest tylko do odczytu . To stary problem.
Możesz jednak całkowicie ominąć kontrolę formularza i przesłać go przez XHR (nie jestem pewien, czy jest to obsługiwane):
Możesz również użyć elementu w okolicy, aby anulować zdarzenie upuszczenia w Chrome i zapobiec domyślnemu zachowaniu ładowania pliku.
Upuszczanie wielu plików na dane wejściowe już działa w Safari i Firefox.
źródło
Oto, z czym wyszedłem.
Korzystanie z Jquery i Html. Spowoduje to dodanie go do plików wstawiania.
źródło
Tylko rozwiązanie CSS:
Zmodyfikowano z https://codepen.io/Scribblerockerz/pen/qdWzJw
źródło
Wiem, że w Chrome działa pewna sztuczka:
Podczas upuszczania plików do strefy upuszczania otrzymujesz
dataTransfer.files
obiekt, czyliFileList
typ obiektu, który zawiera wszystkie przeciągnięte pliki. Tymczasem<input type="file" />
element ma właściwośćfiles
, czyli obiekt tego samegoFileList
typu.Możesz więc po prostu przypisać
dataTransfer.files
obiekt doinput.files
właściwości.źródło
input.files
nie może = (Dla każdego, kto chce to zrobić w 2018 r., Mam znacznie lepsze i prostsze rozwiązanie niż wszystkie stare rzeczy opublikowane tutaj. Możesz stworzyć ładnie wyglądające pole typu „przeciągnij i upuść” za pomocą samego czystego kodu HTML, JavaScript i CSS.
(Jak dotąd działa tylko w Chrome)
Zacznijmy od HTML.
Następnie przejdziemy do stylizacji.
Po wykonaniu tej czynności już wygląda dobrze. Ale wyobrażam sobie, że chciałbyś zobaczyć, jaki plik faktycznie przesłałeś, więc zrobimy trochę JavaScript. Pamiętasz ten zakres wartości pfp? Tam wydrukujemy nazwę pliku.
I to wszystko.
źródło
Niesamowita praca @BjarkeCK. Dokonałem pewnych modyfikacji w jego pracy, aby użyć jej jako metody w jquery:
Working Fiddle
źródło
Kilka lat później zbudowałem tę bibliotekę, aby upuszczać pliki do dowolnego elementu HTML.
Możesz go używać jak
źródło
To, co możesz zrobić, to wyświetlić plik wejściowy i nałożyć na niego przezroczysty obszar upuszczania, uważając, aby użyć nazwy takiej jak
file[1]
. {Upewnij się, żeenctype="multipart/form-data"
tag FORMULARZ znajduje się wewnątrz.}Następnie niech obszar upuszczania obsłuży dodatkowe pliki, dynamicznie tworząc więcej plików wejściowych dla plików 2..number_of_files, upewnij się, że używasz tej samej nazwy podstawowej, odpowiednio wypełniając atrybut wartość.
Na koniec (front-end) prześlij formularz.
Wszystko, co jest wymagane do obsługi tej metody, to zmiana procedury do obsługi tablicy plików.
źródło
multiple
atrybut. Nie potrzeba więcej niż 1 pliku wejściowego. Ale to nie jest problem. Jak wprowadzićFile
obiekty do pliku wejściowego? Myślę, że to wymaga przykładu kodu ...files
właściwości), ale nie udało mi się w IE - czy miałeś szczęście?