Задать вопрос
zkrvndm
@zkrvndm
Архитектор решений

Существуют ли способы удалять файлы выборочно из input multiple?

Предположим имеется поле для вставки файлов с атрибутом multiple, т. е. в него можно вставить сразу много файлов. Могу ли я после выбора файлов посредством JavaScript удалить определенные из них?

Говоря точнее, существуют ли способы удалять элементы из коллекции FileList? Какие-нибудь обходные пути с использованием расширений Chrome?

Возможно существуют способы блобы вставлять в поля как файлы? Блобы то я могу редактировать как хочу.

document.querySelector('input[type="file"]').files; // Коллекция файлов
  • Вопрос задан
  • 497 просмотров
Подписаться 2 Простой 3 комментария
Решения вопроса 3
zkrvndm
@zkrvndm Автор вопроса
Архитектор решений
Я нащупал два решения для этой проблемы.

Первый способ позволяет вставить произвольный Blob в поле <input type="file">. Итак, способ создания коллекции файлов 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;

Можно просто пересоздать коллекцию, если надо что-то удалить из поля.

Второй вариант позволяет получать заранее подготовленные коллекции файлов и далее их вставлять и использовать их где угодно. Для начала нам нужно подключить библиотеку localforage:
<script src="https://cdnjs.cloudflare.com/ajax/libs/localforage/1.9.0/localforage.js"></script>

Далее, мы можем выбрать файлы для коллекции и сохранить их в памяти браузера:
var input = document.createElement('input');
input.setAttribute('type', 'file');
input.setAttribute('multiple', 'multiple');
input.addEventListener('change', async function() {
	var files = await localforage.setItem('files', this.files);
	console.log('Коллекция файлов успешно сохранена:');
	console.dir(files);
});
input.click();

Сохраненную коллекцию мы позднее сможем использовать даже после перезагрузки страницы или закрытия / открытия браузера. Для извлечения сохраненной коллекции достаточно выполнить:
var files = await localforage.getItem('files');
console.log('Коллекция файлов успешно извлечена:');
console.dir(files);

Эта коллекция полноценная и мы легко можем ее прицепить в любое поле:
var files = await localforage.getItem('files');
document.querySelector('input[type="file"]').files = files;

При этом файлы в поле будут выглядеть точно так же, будто выбраны с компа, никаких отличий.
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
Скриптам запрещено редактировать FileList (доступ readonly).
Можно прочитать содержимое, можно полностью очистить, но ни добавить ни частично очистить нельзя.

Зато можно прочитать, убрать лишнее, нужные поля собрать в FormData и отправить это ajax-ом.
https://developer.mozilla.org/ru/docs/Web/API/Form...
Ответ написан
@Soul1Eat
Судя по всему цель ботоводство, а значит почему бы уже не перейти на Puppeteer? И возможностей больше и танцов с бубном меньше, да и судя по первому попавшемуся issue
// Client validation button
const validateClient = await page.$(`section:nth-child(6) > div.span3 > div:nth-child(1) > div > div > input[type="file"]`);
await validateClient.uploadFile('/path/to/file.csv'):

Даже это реализовать просто
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
23 дек. 2024, в 11:07
10000 руб./за проект
23 дек. 2024, в 10:43
5000 руб./за проект
23 дек. 2024, в 10:32
2000 руб./за проект