#javascript #reactjs #input
#javascript #reactjs #ввод
Вопрос:
Я работаю над проектом React и хочу, чтобы пользователь выбирал несколько изображений из входных данных и отображал выбранные изображения в карусели.
Для этого я хочу создать массив с локальными путями указанных изображений.
const [localURL, setLocalURl] = useState([]);
const handleFileInput = (e) => {
e.preventDefault();
e.persist();
for (let i = 0 ; i < e.target.files.length ; i ) {
let reader = new FileReader();
reader.onload = () => {
let dataURL = reader.result;
setLocalURl([...localURL, dataURL]);
}
reader.onerror = (e) => {
console.log('error al leer el archivo', e)
}
reader.readAsDataURL(e.target.files[i])
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.6.3/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.6.3/umd/react-dom.production.min.js"></script>
<div className="form-group custom-file">
<label htmlFor="image" className="custom-file-label">File</label>
<input required className="custom-file-input" type="file" name="image" accept="image/*" onChange={handleFileInput} multiple capture/>
</div>
Проблема в том, что я хочу сохранить пути к этим локальным файлам в массив, localURL в данном случае, и передать это в качестве поддержки компоненту carousel. localURL принимает только последний элемент e.target.файловый объект.
Я пробовал перебирать объект с разными функциями, но ни один из них не дает ожидаемых результатов.
Это работает только с одним изображением за раз. Как мне заставить его работать с несколькими файлами??
Ответ №1:
Вы не получаете локальный путь, это может рассматриваться как проблема безопасности. Вы получаете только имя файла. Вот как получить его в виде массива.
document.querySelector('[type=file]').onchange = function(e) {
console.log(Array.from(e.target.files, file => file.name));
}
<input required className="custom-file-input" type="file" name="image" accept="image/*" multiple capture/>
Комментарии:
1. Я понимаю проблему безопасности, но мне нужен способ сохранить ссылку на файл, чтобы я мог загрузить его при отправке и удалить или добавить файлы перед загрузкой, если пользователь передумает. Как я могу создать массив с этими ссылками, чтобы я мог просматривать и загружать файлы?
2. Array.from(например,target. files, file => файл) создает массив файлов. Вы можете делать с ним все, что захотите.
3. Вам не нужна функция, поскольку вы ничего не преобразуете, просто используйте
Array.from(e.target.files)