Tratatuy
@Tratatuy
Люблю задавать вопросы

Возможно ли создать массив FileList у пустого input[type=file]?

Здравствуйте.

Суть в том, что есть
<input type="file" multiple name="temp" />

и несколько
<input style="display:none" type="file" name="file_1" />
<input style="display:none" type="file" name="file_2" />
<input style="display:none" type="file" name="file_3" />


При выборе пользователем нескольких файлов, необходимо передать эти файлы в скрытые инпуты.

Но если инпут пустой, я не могу просто передать элемент fileList в его массив files, массив не создан.
Как я могу создать массив FileList для пустого input? Есть ли вообще способ?
  • Вопрос задан
  • 251 просмотр
Решения вопроса 2
ThunderCat
@ThunderCat Куратор тега HTML
{PHP, MySql, HTML, JS, CSS} developer
Нет, так не делается, filfilelist это readonly атрибут, в целях безопасности, по этому записать туда ничего нельзя.
Единственный вариант - использовать отдельный массив для хранения загруженных в инпут изображений, так как прочитать из файллиста очень даже можно. Единственный косяк - отправить по субмиту стандартно не получится, только аяксом через создание датаформ.
Тоже мучался с подобной задачей, что получилось в итоге - тут
Ответ написан
@grinat
Нельзя. Но можно через аякс запрос отправить файлы в таком же формате, читай про FormData.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zkrvndm
@zkrvndm
Архитектор решений
Лайфхак для создания коллекции файлов FileList:
var info = 'Какой-нибудь текст';

var dt  = new DataTransfer();
dt.items.add(new File([info], 'primer.txt', {type: 'text/plain'}));
var file_list = dt.files;

console.log('Коллекция файлов создана:');
console.dir(file_list);

// Вставим созданную коллекцию в реальное поле:
document.querySelector('input[type="file"]').files = file_list;

В переменную info вместо текста, можно положить в том числе и Blob - это особенность функции new File() которая первым параметром может принять как массив из текстов, так и массив из Blob.

Фактически лайфхак выше позволяет нам JavaScript-ом скачать любой какой угодно файл со своего сайта и вставить его абсолютно в любое поле <input type="file"> - что просто архиполезно для браузерных ботов.

Также способ выше можно применить для редактирования уже выбранных пользователем файлов. Например, если надо из поля выбора файлов убрать какие-то определенные файлы и при этом сделать не фиктивно, а реально.

Огромное спасибо пользователю Mmx Symfony, который нарыл это решение где-то в недрах иностранных сайтов. Сам я, в свое время сколько не искал, везде был ответ, что это невозможно, а оказалось, что нихрена подобного =)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы