В ежедневной разработке проектов загрузка изображений является очень распространенной сценой. Теперь все виды UI-фреймворков предоставляют свои собственные компоненты загрузки, а в Интернете есть много сторонних компонентов загрузки. Возможно, вы привыкли использовать эти готовые компоненты напрямую, но их конкретная реализация не анализировалась глубоко. В этой статье будут проанализированы знания о загрузке изображений для вас с помощью простого кода.
настройка стиля
Поскольку он загружается, его необходимо использовать для<input type="file">
помечен. Однако по умолчаниюinput
Стиль метки не только единый, но и ведет себя по-разному в каждом браузере, поэтому обычно необходимоinput
Сделайте настройку стиля. но<input>
Теги не очень дружелюбны к модификации стиля. Есть много решений, наиболее часто используемым является<input type="file">
Вкладки скрыты, затем прошли<label>
Ярлыки связываются, а затем изменяются напрямую<label>
стиль этикетки. код показывает, как показано ниже:
<input type="file" id="uploadImg">
<label for="uploadImg">点击上传</label>
Подтверждение изображения
Перед загрузкой файла обычно выполняются различные проверки, такие как тип файла, размер, формат, размер и т. д.
Среди них тип файла может быть установлен<input>
помеченaccept
указать тип файла. ноaccept
Атрибуты не полностью запрещают пользователям загружать файлы, отличные от указанного типа. Таким образом, вы можете проверить и перехватить каждый атрибут загружаемого файла. Перед проверкой нам нужно пройтиchange
Объект события для перехода к загруженному файлу:
event.target.files
Можно получить список загруженных файлов. Объекты в списке содержат следующую информацию:
{
lastModified: 1524153515000
lastModifiedDate: Thu Apr 19 2018 23:58:35 GMT+0800 (中国标准时间) {}
name: "589adfbfe821c.jpg"
size: 1357444
type: "image/jpeg"
webkitRelativePath: ""
}
Из этого объекта мы можем получить такую информацию, как размер файла, тип файла, имя файла и т. д., чтобы мы могли проверить эту информацию перед загрузкой, тем самым перехватив нелегальные файлы.
Однако изfile
В объекте мы не можем получить информацию о размере изображения. В нашем бизнесе во многих сценариях необходимо ограничить размер загружаемых изображений определенным фиксированным значением или определенным соотношением. Чтобы уменьшить проблему адаптации в более позднем отображении. Чтобы реализовать проверку размера загруженного изображения, нам нужно использоватьFileReaderа такжеImage.
FileReader
Объекты позволяют веб-приложениям асинхронно читать файлы, хранящиеся на компьютере пользователя.
Image()
Функция создаст новый экземпляр HTMLImageElement. Он функционально эквивалентенdocument.createElement('img')
.
Здесь нам нужно использоватьfileReader
изreadAsDataURL()
метод для чтения информации о загруженном файле, черезonload
Обрабатывайте события, чтобы получить информацию о прочитанном файле. следующим образом:
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = e => {
console.log(e.target.result)
}
В коде файл — это список файлов, которые мы получили доfiles
файловый объект в формате .e.target.result
для чтения содержимого файла.
проходить послеnew Image()
Функция создает новый экземпляр HTMLImageElement и помещает экземплярsrc
назначить какfileReader
Прочтите содержимое файла. Вы можете получить экземпляр файла HTMLImageElement, через который мы можем прочитать информацию о размере изображения. Конкретный код выглядит следующим образом:
const image = new Image();
image.src = e.target.result;
image.onload = () => {
console.log(image.width, image.height);
}
Предварительный просмотр загрузки изображения
Перед разработкой загрузите изображения, чтобы показать, часто используйте первую загрузку файла, предварительный просмотр фотогалереи, чтобы напрямую загрузить изображения на сервер, но это не может быть достигнуто перед загрузкой предварительного просмотра изображения, и это приведет к загрузке большого количества мусора картинки .
Благодаря предыдущим исследованиям по получению размера изображения. Я считаю, что вы можете быстро придумать более элегантное решение для предварительного просмотра изображений.Теперь, когда мы получили экземпляр файла HTMLImageElement, мы можем напрямую использовать экземплярappend
Вскоре перейдем к контейнеру страницы Dom. Или напрямую установить полученный файл в существующийimage
помеченsrc
в свойствах. Предварительный просмотр загрузки изображений — это так просто.
Загрузка изображения и отображение прогресса загрузки
Чтобы загрузить изображения, мы можем напрямую передатьform
тег с формойsubmit()
способ загрузки изображений. Однако таким образом мы не можем проверить и перехватить загружаемый файл перед загрузкой. В то же время пользователь должен активно инициировать операцию отправки. Чтобы работа предзагрузочного перехвата, которую мы делали раньше, не прошла даром, нам нужно активно инициировать операцию загрузки файла в нужное время.
Здесь вам нужно использоватьFormDataobject для преобразования входных данных объекта в данные формы.
FormData
Объект используется для компиляции данных в пары ключ-значение для отправки данных с помощью XMLHttpRequest. Он в основном используется для отправки данных формы, но также может использоваться для отправки данных с ключом (keyed data
), который используется независимо от формы. если формаenctype
свойство установлено наmultipart/form-data
, метод формы submit() используется для отправки данных, так что отправленные данные имеют ту же форму.
Сначала мы создаемformData
объект, а затем передатьappend()
способ добавления полей. следующим образом:
const formData = new FormData();
formData.append("file", file);
Уведомление,formData
Хотя объект, черезconsole.log
Но он не может распечатать свое конкретное значение, просто получитеFormData {}
.
Затем создайтеXMLHttpRequest
Объект, используемый для отправки ajax-запросов. и черезXMLHttpRequest
объектupload.onprogress
метод, информация о загрузке может быть получена в режиме реального времени, а ход загрузки может быть дополнительно получен. Конкретный код выглядит следующим образом:
const client = new XMLHttpRequest()
client.open("POST", uploadUrl)
client.upload.onprogress = function(e) {
if (e.lengthComputable) {
let total = e.total;
let loaded = e.loaded;
let percentage = parseFloat(loaded / total).toFixed(2);
}
}
client.send(formData)
В приведенном выше кодеuploadUrl
URL для загрузки. пройти черезupload.onprogress
Объект события объекта события, вы можете получить размер загруженного файла и полный размер файла текущего прогресса.С помощью этих двух параметров размера вы можете легко рассчитать долю загруженного файла, а затем отображать ли загрузите индикатор выполнения или отобразите данные о ходе выполнения, просто вы можете работать по своему желанию.
перетащить загрузить
В дополнение к традиционной загрузке файла щелчком мыши, загрузка файла с помощью перетаскивания также является очень распространенным сценарием. Чтобы использовать загрузку с помощью перетаскивания, вам нужно использовать метод перетаскивания H5.drop
а такжеdrag
метод. В дополнение к этим двум основным методам существует несколько методов, запускаемых на разных этапах перетаскивания.Обычно используемые методы перетаскивания следующие:
- событие ondragstart: событие, инициированное, когда перетаскиваемый элемент начинает перетаскиваться (объект является перетаскиваемым элементом)
- ondrag: это событие запускается непрерывно во время перетаскивания элемента с
touchmove
события похожи. (Объект действия — это перетаскиваемый элемент) - событие ondragend: событие, инициированное при завершении перетаскивания (объект является перетаскиваемым элементом)
- событие ondragenter: событие, инициированное, когда перетаскиваемый элемент входит в целевой элемент (целевой элемент является целевым элементом)
- событие ondragover: событие, срабатывающее, когда перетаскиваемый элемент перемещается по целевому элементу (целевой элемент является целевым элементом)
- событие ondragleave: событие, срабатывающее, когда перетаскиваемый элемент перемещается по целевому элементу (целевой элемент является целевым элементом)
- событие ondrop: событие, инициированное, когда перетаскиваемый элемент находится на целевом элементе и отпускается мышь (целевой элемент является целевым элементом)
События перетаскивания аналогичныtouch
различные этапы мероприятия. Однако следует отметить, что каждое событие перетаскивания имеет свой объект действия, а объект действия делится на «перетаскиваемый элемент» и «целевой элемент». Перетаскиваемый элемент — это перетаскиваемый элемент Dom, который в основном используется в сцене, где Dom перетаскивается и перемещается по странице. Целевой элемент — это область элемента, которая получает перетаскиваемый элемент. Когда перетаскиваемый элемент входит в область, будет запущена серия событий целевого объекта.
В бизнес-сценарии перетаскивания и загрузки изображения перетаскиваемый элемент представляет собой файл изображения за пределами страницы, поэтому здесь используются только события целевого элемента. Мы можем использовать эти события для изменения стиля целевой области и так далее. Два основных события — этоondragover
а такжеondrop
мероприятие. Может быть, вы думаете, что мне просто нужно получить перетаскиваемый файл, когда я отпускаю мышь, поэтому просто используйтеondrop
событие на линии? Однако из-за поведения браузеров по умолчаниюondrop
События не запускаются. Следовательно, необходимо использоватьe.preventDefault();
остановитьсяondropover
событие браузера по умолчанию, тем самым гарантируяondrop
триггер события. пройти черезondrop
Объект события для мероприятия, мы можем добраться доevent.target.files
Тот же список файлов, метод полученияevent.dataTransfer.files
; Однако после того, как вы напишете это и перетащите, вы обнаружите, что браузер автоматически переходит на страницу предварительного просмотра изображения. Это также связано с поведением браузеров по умолчанию, поэтому также необходимо использоватьe.preventDefault();
чтобы предотвратить поведение браузера по умолчанию. Таким образом, можно выполнять последующие операции проверки файлов.
Конкретный код реализации выглядит следующим образом:
<label for="uploadImg"
onDragOver={e => {
e.preventDefault();
}}
onDrop={e => {
if (e.dataTransfer) {
e.preventDefault();
const file = e.dataTransfer.files[0];
...
}
}}
</label>
На данный момент общеизвестные моменты загрузки изображений разобраны, и вы можете их добавить.