Не удается прочитать перетаскивание файла с помощью FileReader

Я пытаюсь разрешить загрузку изображения на мой сайт с помощью перетаскивания на мой сайт путем перетаскивания изображения на определенный div на странице:

<div class = "container" (drop) = "onDrop($event)" (dragover) = "onDragOver($event)" (dragleave) = "onDragLeave($event)">
    <img id = "blah" [src] = "url || 'http://placehold.it/180'" alt = "your image" />

</div>

У меня есть все события, связанные с перетаскиванием, однако я не смог получить изображение из FileReader:

Что я делаю неправильно? мои функции, связанные с падением с контроллера, приведены ниже для справки.

onDrop(event) {
    event.preventDefault();
    event.stopPropagation();
    this.file = event.dataTransfer.files[0];
    const reader = new FileReader();
    reader.onload = e => {
        this.url = reader.result;
        console.info(this.url);
    };
    reader.readAsDataURL(this.file);
    this.fileDraggedOverDiv = false;
}

onDragOver(event) {
    event.stopPropagation();
    event.preventDefault();
    this.fileDraggedOverDiv = true;
    return false;
}

onDragLeave(event) {
    event.stopPropagation();
    event.preventDefault();
    this.fileDraggedOverDiv = false;
    return false;
}
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
509
1

Ответы 1

Фактически вы успешно передаете файл событию onDrop. Просто вы не можете видеть это, когда выполняется console.info(JSON.stringify(event));, потому что унаследованные свойства и неперечислимые свойства не учитываются, как указано в это обсуждение.

Чтобы получить изображение с события нужно сделать следующее.

onDrop(event) {
    event.preventDefault();
    const file = event.dataTransfer.files[0];
}

См. этот стекблиц для полного рабочего примера.

Хорошо, спасибо за помощь. Как я должен отображать изображение? Я использую FileReader.readDataAsUrl(), чтобы попытаться получить URL-адрес изображения, и, похоже, он не работает.

Tyler B. Joudrey 21.02.2019 22:06

@TylerB.Joudrey Это работает так же, как я сделал это в своем собственном проекте. Убедитесь, что вы определили событие reader.onload, и в событии вы установили значение src элемента изображения. Также, если мой ответ сработал для вас, пожалуйста, примите ответ.

Tatenda Zifudzi 22.02.2019 07:53

Я определил это как reader.onload = e => { this.url = reader.result; console.info(this.url); };

Tyler B. Joudrey 22.02.2019 14:19

И URL-адрес все еще не работает, поэтому я не могу принять ответ, пока он не появится.

Tyler B. Joudrey 22.02.2019 14:59

@TylerB.Joudrey Будет трудно сказать, что не так с вашим кодом, не видя его. Взгляните на ссылку stackblitz, которую я добавил к ответу, и дайте мне знать, если вам удастся заставить ваш код работать, ссылаясь на нее.

Tatenda Zifudzi 22.02.2019 15:47

Другие вопросы по теме