В наши дни мы можем перетаскивать файлы в специальный контейнер и загружать их с помощью XHR 2. Многие за один раз. С живыми прогресс-барами и т. Д. Очень классные вещи. Пример тут.
Но иногда мы не хотим такой крутости. То , что я хотел бы , чтобы перетащить и падение файлов - многие в то время - в стандартный ввод HTML файла : <input type=file multiple>
.
Это возможно? Есть ли какой-нибудь способ «заполнить» файл ввода правильными именами файлов (?) Из файла drop? (Полные пути к файлам недоступны по соображениям безопасности файловой системы.)
Зачем? Потому что я хотел бы отправить нормальную форму. Для всех браузеров и всех устройств. Перетаскивание - это просто прогрессивное улучшение для улучшения и упрощения UX. Там будет стандартная форма со стандартным вводом файла (+ multiple
атрибут). Я хотел бы добавить улучшение HTML5.
править
Я знаю , в некоторых браузерах вы можете иногда (почти всегда) перетаскивать файлы в сам файл ввод. Я знаю, что Chrome обычно делает это, но иногда он терпит неудачу, а затем загружает файл на текущей странице (большая ошибка, если вы заполняете форму). Я хочу обмануть и браузер.
источник
input type="file" multiple
работать хорошо в SafariОтветы:
Следующее работает в Chrome и FF, но мне еще предстоит найти решение, которое также охватывает IE10 +:
Возможно, вы захотите использовать
addEventListener
или jQuery (и т. Д.) Для регистрации ваших обработчиков evt - это просто для краткости.источник
MSIE
,Trident/
(IE11) иEdge/
(IE12) ...fileInput.files = evt.dataTransfer.files;
. Safari и Chrome работают нормально.Я сделал решение для этого.
Показать фрагмент кода
Функция перетаскивания для этого метода работает только с Chrome, Firefox и Safari. (Не знаю, работает ли он с IE10), но для других браузеров кнопка «Или нажмите здесь» работает нормально.
Поле ввода просто следует за мышью при перетаскивании файла на область, и я также добавил кнопку ..
Непрозрачность непрозрачности: 0; ввод файла виден только для того, чтобы вы могли видеть, что происходит.
источник
Это «HTML5» способ сделать это. Нормальный ввод формы (который только для чтения, как указал Рикардо Томази). Затем, если файл перетаскивается, он прикрепляется к форме. Для этого потребуется изменить страницу действий, чтобы принять загруженный таким образом файл.
Еще лучше, если вы можете сделать все окно зоной перетаскивания, см. Как я могу обнаружить событие перетаскивания HTML5, входящее и выходящее из окна, как это делает Gmail?
источник
input type=file
.value
свойство самым новым файлом каждый раз, когда выполняете цикл fore fore?источник
Теоретически, вы можете добавить элемент, наложенный на
<input/>
, и затем использовать егоdrop
событие для захвата файлов (используя File API) и передачи их во входнойfiles
массив.За исключением того, что входной файл доступен только для чтения . Это старая проблема.
Однако вы можете полностью обойти контроль формы и загрузить его через XHR (не уверен насчет поддержки):
Вы также можете использовать элемент в окружающей области, чтобы отменить событие drop в Chrome и предотвратить поведение по умолчанию при загрузке файла.
Удаление нескольких файлов поверх ввода уже работает в Safari и Firefox.
источник
Это то, что я вышел.
Использование Jquery и Html. Это добавит его в файлы вставки.
источник
Для решения только для CSS:
Модифицировано с https://codepen.io/Scribblerockerz/pen/qdWzJw
источник
Я знаю некоторые хитрости в Chrome:
При перетаскивании файлов в зону перетаскивания вы получаете
dataTransfer.files
объект, то естьFileList
тип объекта, который содержит все файлы, которые вы перетащили. Между тем,<input type="file" />
элемент имеет свойствоfiles
, то естьFileList
объект того же типа.Таким образом, вы можете просто присвоить
dataTransfer.files
объектinput.files
свойству.источник
input.files
не может = (Для тех, кто хочет сделать это в 2018 году, у меня есть намного лучшее и более простое решение, чем все старые вещи, размещенные здесь. Вы можете создать красивый перетаскивающий блок с простым HTML, JavaScript и CSS.
(Пока работает только в Chrome)
Давайте начнем с HTML.
Тогда мы перейдем к стайлингу.
После того, как вы это сделали, все уже выглядит хорошо. Но я думаю, что вы хотели бы посмотреть, какой файл вы загрузили на самом деле, поэтому мы собираемся сделать немного JavaScript. Помните этот диапазон значений pfp? Вот где мы распечатаем имя файла.
И это все.
источник
Потрясающая работа @BjarkeCK. Я внес некоторые изменения в его работу, чтобы использовать его в качестве метода в jquery:
Рабочая скрипка
источник
Несколько лет спустя я построил эту библиотеку чтобы перетаскивать файлы в любой элемент HTML.
Вы можете использовать его как
источник
Что вы можете сделать, это отобразить файл ввода и наложить его на прозрачную область перетаскивания, стараясь использовать имя вроде
file[1]
. {Убедитесь, чтоenctype="multipart/form-data"
внутри вашего тега FORM.}Затем дроп-область обрабатывает дополнительные файлы, динамически создавая дополнительные входные данные для файлов 2..number_of_files, обязательно используйте то же базовое имя, заполняя атрибут-значение соответствующим образом.
Наконец (передний конец) отправьте форму.
Все, что требуется для обработки этого метода, - это изменить процедуру обработки массива файлов.
источник
multiple
атрибут в эти дни. Нет необходимости вводить более 1 файла. Это не проблема, хотя. Как мне получитьFile
объекты в файл ввода? Я думаю, что это требует некоторого примера кода ...files
свойства), но в IE мне не удалось - вам повезло?