Как сделать скачивание файла с сайта js

Добавил пользователь Валентин П.
Обновлено: 05.10.2024

При всем бурном развитии web, и стандартов html в частности, работа с файлами, практически никогда не менялась. К счастью, с приходом HTML5 и связанных с ним API, сейчас у нас гораздо больше возможностей для работы с файлами, чем когда-либо в предыдущих версиях браузеров(iOS до сих пор нет поддержки File API).

Тип Файл - File

Тип File определен в спецификации File API[1] и является абстрактным представлением файла. Каждый экземпляр File имеет следующие свойства:
name – имя файла
size – размер файла в байтах
type – MIME тип файла

Объект типа File дает важную информацию о файле, не предоставляя прямой доступ к содержимому файла. Он является лишь ссылкой на файл, и получение данных из этого файла является отдельным процессом в целом.

Получение ссылок на файлы

Разумеется, доступ к пользовательским файлам строго запрещен в Интернете, потому как очевидны проблемы с безопасностью личных данных. Вы не хотели бы, чтобы Вы загружали веб-страницу, а затем она сканировала Ваш жесткий диск и выясняла, что там есть полезного. Нужно разрешение от пользователя, чтобы получить доступ к файлам с его компьютера. Тем не менее для веб-страниц чтения файлов разрешено каждый раз, когда пользователь решат что-то загрузить.

Когда вы используете элемент , Вы даете веб странице (и серверу) разрешение на доступ к файлу. Так, что первое, как вы можете получить объект File, это поле .

HTML5 определяет файловые ссылки для всех управления. Эта коллекция FileList, которая представляет собой структуру в виде массива под названием FileList содержащую объекты типа File для каждого выбранного файла в поле (помните, HTML5 позволяет выбрать несколько файлов в этом элементе управления). Так что в любой момент времени, Вы можете получить доступ к файлам пользователя, которые он выбрал, с помощью кода вроде этого:

Этот сравнительно простой код ожидает событие изменения в контроле( ). Когда событие происходит, это означает, что выбор файла изменился, и код перебирает все объекты типа File и выводит информацию из них. Имейте в виду, что свойство файлов всегда доступны из JavaScript, так что вам не придется ждать следующего изменения, чтобы попытаться сделать что-то другое с ними.

Drag and drop файлов

Доступ к файлам из формы по средствам контролов по-прежнему требует действий пользователей: нахождение и выбора интересующего файла. К счастью, HTML5 Drag and Drop предоставляет еще один способ для пользователей, чтобы предоставить доступ к своим файлам: путем простого перетаскивания файлов с рабочего стола в веб-браузер. Все, что вам нужно сделать, чтобы это реализовать отслеживать два события.

Для того, чтобы читать файлы, которые упали на элемент страницы, вы должны отслеживать события DragOver и Drop, и отменять действия по умолчанию, в обоих. Это говорит браузеру, что вы знаете, что делаете :) и отменяет стандартные действия в таких случаях. Например, когда Вы перетаскиваете на страницу файл изображения, стандартным действием в таком случае будет открытие этого файла в этой вкладке. Это действие нужно отменить.

event.dataTransfer.files другой FileList объект, через который вы можете получить доступ, к информации о файлах. Код почти такой же, как и контролами формы и объекты типа File могут быть доступны таким же образом.

AJAX pагрузка файлов

Самое замечательное в объекте FormData, что вы можете добавить файл непосредственно к нему, фактически имитируя загрузку файла через HTML-форму. Все, что вам нужно сделать, это добавить в файл ссылки с определенным именем, и браузер сделает все остальное. Для примера:

И все это работает на последней версии большинства браузеров, включая Internet Explorer 10. К сожалению Internet Explorer 9 этого пока не поддерживает.

Что дальше

Теперь вы знаете два способа доступа к информации о файле в браузере: через контрол формы и через нативный 'drag and drop'. Вероятно, появятся и другие способы доступа к файлам в будущем, но сейчас Вам нужно знать только эти два. Конечно, читать информацию о файлах, это только часть проблемы.Следующим шагом будет чтение данных из этих файлов, об этом и напишу во второй части статьи.

при нажатии на эти ссылки отправьте запрос AJAX на сервер, который возвращает URL-адрес с местоположением файла.

попробуйте этот lib https://github.com/PixelsCommander/Download-File-JS это более современный, чем все решения, описанные ранее, потому что использует атрибут "скачать" и сочетание методов, чтобы принести наилучший опыт.

кажется идеальным фрагментом кода для начала загрузки в JavaScript.

мы делаем это таким образом: Сначала добавьте этот скрипт.

вот код, который парсит ?файл= файл querystring (взято из этого вопроса) и перенаправляет пользователя на этот адрес за 1 секунду (работает для меня даже в браузерах Android):

Если у вас есть jQuery в вашем проекте, обязательно удалите это окно.и окна onpopstate.загрузите обработчики и сделайте все в $(document).готовые(функция () < >);


Известный факт, что поле для загрузки файлов трудно стилизовать так, как хочется разработчику. Многие просто скрывают его и добавляют кнопку, которая открывает диалог выбора файлов. Однако, теперь у нас появился даже ещё более модный способ обработки выбора файлов: drag and drop.

Технически это уже было возможно сделать, потому что большинство (если не все) реализации поля выбора файлов позволяли перетаскивать файлы для их выбора, но это требовало от вас показывать элемент с типом file . Итак, давайте по-настоящему использовать API, которое даёт нам браузер, для реализации выбора файлов через drag-and-drop и их загрузки на сервер.

В этой статье мы будем использовать чистый ES2015+ JavaScript (без фреймворков или библиотек) для выполнения этого проекта, и это предполагает, что у вас есть опыт работы с JavaScript в браузере. Этот пример — помимо ES2015+ синтаксиса, который можно легко изменить на синтаксис ES5 или транспилировать с помощью Babel — должен быть совместим со всеми вечнозелёными браузерами + IE 10 и 11.

Ниже можете видеть пример того, что должно получиться:

Демонстрационная страница, на которой можно загрузить файлы с помощью drag and drop с немедленным предварительным просмотром изображений и демонстрацией индикатора прогресса загрузки.

Первое, что мы должны обсудить, это события связанные с перетаскиванием, потому что они движущая сила этого функционала. В общем, есть восемь событий, срабатывающих в браузере и связанных с перетаскиванием: drag , dragend , dragenter , dragexit , dragleave , dragover , dragstart и drop . Мы не будем проходиться по ним всем, потому что события drag , dragend , dragexit и dragstart срабатывают на элементе, который перетаскивают, а это не наш случай, мы будем перетаскивать файлы из нашей файловой системы вместо DOM-элементов, так что эти события никогда не сработают.

Если вам стало интересно почитать об этих событиях, то вы можете изучить документацию связанную с ними на MDN.

Как и следовало ожидать, вы можете навесить обработчики для нужных событий таким же образом, каким происходит регистрация обработчиков большинства браузерных событий: с помощью addEventListener .

Ниже приведено небольшое описание того, что эти события делают. Используем dropArea из примера кода выше для того, чтобы сделать описание понятнее:

Событие dragenter — перетаскиваемый объект перетаскивается над dropArea , делая dropArea целью события drop , если пользователь перетащит его туда. Событие dragleave — перетаскиваемый объект перетащили за пределы dropArea на другой элемент, делая его целью события drop вместо dropArea . Событие dragover срабатывает каждые несколько сотен миллисекунд, пока объект перетаскивают над dropArea . Событие drop — пользователь отпустил кнопку мыши, перетаскиваемый объект перетащили на dropArea .

Стоит отметить, что при перетаскивании объекта над элементом, являющимся дочерним для dropArea , событие dragleave сработает над dropArea , а событие dragenter на дочернем элементе, потому что он становится target . Событие drop всплывёт до элемента dropArea (конечно, если до этого всплытие не остановит другой обработчик событий), таким образом событие сработает на dropArea , несмотря на то, что target у него будет другим.

До того как мы начнём добавлять функциональность drag-and-drop, нам надо добавить базовую форму со стандартным полем типа file . Технически это не обязательно, но рекомендуется предоставить такую альтернативу пользователям, чей браузер не поддерживает drag-and-drop API.

Довольно простая структура. Вы можете заметить обработчик события onchange на input . Посмотрим на него позже. Было бы также хорошей идеей добавить action к тегу form и кнопку submit , чтобы помочь людям, у которых выключен JavaScript. Затем можно использовать JavaScript для того, чтобы избавиться от них, почистить форму. В любом случае, вам понадобится серверный скрипт для загрузки файлов, неважно написан ли он собственными силами или вы используете сервис, такой как Cloudinary. Кроме этого, здесь нет ничего особенного, так что давайте набросаем стили:

Многие из этих стилей пока не используются, но это нормально. Основным моментом является то, что поле file скрыто, а его подпись label стилизована так, чтобы выглядеть как кнопка, таким образом люди поймут, что кликнув по нему вызовется диалог выбора файлов. Кроме того, мы следуем соглашению, согласно которому область, куда следует перетащить файл, обозначается пунктирной линией.

Теперь можем перейти к сладкому: drag and drop. Давайте напишем скрипт внизу страницы или в отдельном файле, смотря как вам больше нравится. Первое, что нам понадобится — это ссылка на область, куда предстоит тащить файл. Так мы сможем обрабатывать нужные нам события на ней:

Теперь давайте добавим сами события. Начнём с добавления обработчиков для всех событий, чтобы предотвратить поведение по умолчанию и остановить всплытие выше необходимого:

Мы использовали оба события dragenter и dragover для подсвечивания области для перетаскивания по причинам, о которых я говорил ранее. Если вы начинаете перетаскивать непосредственно над dropArea и затем перешли на дочерний элемент, то сработает событие dragleave и подсвечивание области пропадёт. Событие dragover сработает после событий dragenter и dragleave , так что подсветка вернётся обратно на dropArea до того, как мы увидим, что она пропала.

Мы также убираем подсветку, когда перетаскиваемый элемент покидает обозначенную область и когда его перетаскивают в неё.

Теперь всё что нам нужно, это выяснить что делать, когда файлы будут перетащены:

Код выше не приближает нас к цели, но делает две важные вещи:

  1. Демонстрирует, как получить данные о файлах, которые перетащили.
  2. Приводит нас в то же место, что и поле input с типом file и обработчиком на событие onchange : handleFiles .

Помните о том, что files это не массив, а FileList . Таким образом, при реализации handleFiles , нам нужно преобразовать FileList в массив, чтобы более легко было его итерировать:

Это было скучно (That was aniticlimactic). Перейдём к uploadFile , где будут действительно крутые штуки (real meaty stuff).

В зависимости от настроек вашего сервера, вы можете проверять различные значения status , отличные от 200 , но для наших нужд это сработает.

Это вся базовая функциональность, но часто требуется её расширить. Конкретно в этом руководстве, мы добавим панель предпросмотра, где будут показаны выбранные изображения, также добавим индикатор прогресса, который будет показывать пользователю статус загрузки. Итак, давайте начнём с предпросмотра изображений.

Есть несколько способов сделать это: вы можете ждать пока изображения загрузятся и запросить у сервера URL для картинок, но это означает что вам придётся ждать пока выполняется загрузка, а временами изображения могут быть довольно большими. Альтернатива, которую мы будет исследовать сегодня — это использовать FileReader API с данными файлов, которые мы получили из события drop . Это работает асинхронно, но вы можете использовать синхронную альтернативу FileReaderSync, но пользователи могут попробовать прочитать несколько больших файлов подряд, таким образом, это может заблокировать поток выполнения на длительное время и по-настоящему испортить впечатления пользователя от сервиса. Что же, давайте создадим функцию previewFile и посмотрим как это работает:

Здесь мы создали new FileReader и вызвали метод readAsDataURL для объекта File . Как уже упоминалось, это работает асинхронно, поэтому нужно добавить обработчик события onloadend для обработки результата чтения файла. После этого используем base64 URL для атрибута src нового элемента и добавляем его в элемент gallery . Есть только две вещи, которые надо сделать, чтобы всё было готово и работало: добавить элемент gallery и вызов функции previewFile .

Во-первых, добавим HTML, который приведен ниже, сразу после закрывающего тега form :

Ничего особенного, это просто div . Стили уже заданы для него и изображений в нём, так что больше здесь ничего делать не надо. Теперь изменим функцию handleFiles на следующую:

Есть несколько способов сделать это, например композиция или простой колбэк forEach , в котором запускается uploadFile и previewFile , и это тоже сработает. Таким образом, когда вы перетащите или выбираете несколько изображений, они будут показаны почти мгновенно ниже формы. Интересная мысль по этому поводу: в некоторых приложениях вы можете не захотеть действительно загружать изображения на сервер, а вместо этого хранить ссылки на них в localStorage или в каком-нибудь другом кеше на стороне пользователя, чтобы приложение имело к ним доступ позже. Я лично не могу придумать хорошие сценарии использования этого, но я готов поспорить, что такие есть.

Примечание переводчика: от себя добавлю, что для реализации предпросмотра неграфических файлов, было бы неплохо подготовить изображения-заглушки, которые будут показаны при добавлении таких файлов. Такая картинка в дальнейшем может быть заменена другой, которую подготовит сервер уже после загрузки файла.

Если что-нибудь занимает некоторое время, индикатор прогресса помогает пользователю понять, что процесс идёт, и показывает, как долго это что-нибудь будет выполняться. Добавить индикатора прогресса довольно легко благодаря HTML5 тегу progress . Давайте начнём с добавления его в HTML-код.

Когда мы только начинаем загрузку, вызовем функцию initializeProgress для сброса состояния индикатора. Затем, с каждой выполненой загрузкой, мы вызываем функцию progressDone для увеличения числа загруженых файлов на единицу и обновления индикатора для демонстрации прогресса. Итак, добавим вызовы этих функций, обновив пару старых:

Тогда нам нужно обновить и наши функции. Переименуем progressDone в updateProgress и изменим её код как показано ниже:

Теперь initializeProgress инициализирует массив с длиной, равной numFiles , который заполнен нулями, означающими, что каждый файл загружен на 0%. В updateProgress мы видим какое из изображений обновляет свой прогресс и изменяем значение элемента с нужным индексом на предоставленный percent . Затем мы вычисляем общий процент выполнения как среднее среди всех процентов и обновляем индикатор прогресса, чтобы отобразить вычисленное значение. Мы по-прежнему вызываем initializeProgress в handleFiles также, как делали это в примере с fetch . Таким образом, всё что нам нужно, это обновить uploadFile , добавив вызов updateProgress .

Первое, что нужно отметить, это то, что мы добавили параметр i . Это индекс файла в списке файлов. Нам не нужно обновлять handleFiles для передачи этого параметра, потому что он использует forEach , который уже передаёт индекс элемента вторым параметром в колбэк. Также мы добавили слушатель события progress в xhr.upload , чтобы можно было вызвать updateProgress со значением прогресса. Объект события ( e в нашем коде) имеет два информативных поля: loaded — количество уже загруженных байтов, и total — общее количество байтов.

Выражение || 100 нужно потому, что иногда, при возникновении ошибки, e.loaded и e.total будут равны нулю, что значит, что вычисления с ними дадут NaN , таким образом 100 используется вместо отчёта о выполнении загрузки. Вы можете также использовать 0 . В любом случае ошибки будут отображаться в обработчике события readystatechange , и вы можете сообщить о них пользователю. Это сделано просто для предотвращения исключений, связанных с попытками вычислений с NaN .

Примечание редактора: Такой подход к подавлению ошибок не очень правильный, и, к тому же, приводит к скачкам индикатора загрузки. Гораздо надёжнее заранее проверить значения на корректность и в случае ошибки не менять значение индикатора загрузки.

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


Closify

Closify

jQuery- библиотека для загрузки и управления графическим контентом. С помощью Closify можно загружать изображения, изменять размер, обрезать и сохранять их. После редактирования изображения будут сохранять соотношение сторон.

jQuery File Upload

jQuery File Upload

Эта библиотека предлагает более универсальный набор функций. Она поставляется с 5 различными стилями на выбор, включая нативный пользовательский интерфейс jQuery. А также с вариантом для разработчиков AngularJS, которым необходимо быстрое и надежное решение для загрузки файлов.

Функции jQuery File Upload включают в себя инструмент перетаскивания нескольких файлов с рабочего стола, индикатор выполнения для каждой загрузки. Библиотека работает с любой серверной платформой (PHP, Python, Ruby on Rails, Java, Node.js, Go и т. д.), которая поддерживает стандартную загрузку файлов через HTML-формы.

jQuery.filer

jQuery.filer

Сложный jQuery-плагин для управления файлами. Он включает в себя валидаторы файлов для установки ограничений на размер загружаемых файлов, количество и тип файлов. Можно использовать редактор браузера для предварительного просмотра файлов и их редактирования.

jQuery.filer также имеет собственный API, который позволят изменять внешний вид и функционал загрузчика. Его документация охватывает все варианты вызовов и событий.

jQuery Ajax File Uploader

jQuery Ajax File Uploader

Скрипт на основе Bootstrap использует простой подход к загрузке файлов. Он предоставляет возможность выбора нескольких файлов и снабжен виджетом индикатора выполнения.

Этот плагин создан для современных браузеров, поэтому для его настройки потребуются знания JavaScript и AJAX.

Dropzone

Dropzone

Fine Uploader

Fine Uploader

Полнофункциональное решение для загрузки файлов. Это популярная jQuery- библиотека для загрузки, управления и масштабирования файлов. Ее функционал позволяет повторять неудачные загрузки файлов не с самого начала, а с того фрагмента, который не был загружен.

Fine Uploader поддерживает управление файлами в облаке. То есть, позволяет загружать файлы в Amazon S3 или Microsoft Azure. Другие возможности библиотеки: управление правами на редактирование, удаление файлов по мере их загрузки. Это полноценное решение для любого сайта, которому требуется надежный скрипт для загрузки файлов.

Flow.js

Flow.js

Flow.js — это JavaScript- библиотека, поддерживающая несколько одновременных загрузок через HTML5 API. Она поддерживает такие функции, как приостановка и возобновление загрузки, восстановление прерванных загрузок и обработка ошибок в загрузчике.

Flow.js предоставляет инструмент для загрузки файлов перетаскиванием файлов и целых папок, средство предварительного просмотра изображений.

В состав библиотеки входят индикаторы выполнения, которые позволяют следить за ходом загрузки.

Formstone

Formstone

Formstone – это набор инструментов, реализованных в рамках одного проекта. В нем есть компонент Upload, который является удобным решением для управления загрузкой файлов. Он имеет простой интерфейс перетаскивания, который позволяет загружать один или сразу несколько файлов. Это эффективное решение для сайтов, которым необходимы дополнительные компоненты без лишних функций. Formstone позволяет собрать несколько десятков компонентов и создать на их основе собственные веб-приложения.

File Uploader

File Uploader

Пример того, насколько современными могут быть браузерные инструменты. Инструмент поддерживает быструю загрузку файлов. В нем можно создавать различные вызовы, чтобы управлять файлами. А также загружать файлы перетаскивания, индикаторы выполнения и назначать каждую загрузку конкретному пользователю. Скрипт можно использовать как полнофункциональное решение для загрузки файлов, защищенных паролем.

PekeUpload

PekeUpload

Легкое компонентное решение для веб-дизайнеров. Его можно применять как виджет сайта для загрузки файлов, используя функции jQuery + HTML5.

PekeUpload, созданный на основе Bootstrap, предлагает множество способов расширения. С его помощью можно контролировать загрузку файлов (установить ограничения на размер и тип), задать собственные уведомления об ошибках, просматривать визуальный контент до и после загрузки.

Backbone Upload Manager

Backbone Upload Manager

Backbone представляет собой структуру для JavaScript-приложений с моделями привязки ключ-значение, пользовательскими событиями и коллекциями. Он поддерживает API представлений с декларативной обработкой событий.

Backbone может подключить его к приложениям через интерфейс RESTful JSON.

FileDrop

FileDrop

FileAPI

FileAPI

Разработчики могут создать собственную jQuery-библиотеку для управления файлами. Другой способ решить эту проблему заключается в использовании специализированного API. Мы рекомендуем FileAPI, который предоставляет все функции, вызовы и события, необходимые для создания загрузчиков файлов, предназначенных для десктопных и мобильных приложений, веб-сервисов.

Plupload

Plupload

Plupload — это API-интерфейс управления загрузкой файлов, который предоставляет целый ряд инструментов и функций для создания продвинутых загрузчиков.

Resumable.js

Resumable.js

Данный скрипт предоставляет простую среду, которая позволяет выполнять несколько загрузок одновременно, приостанавливать и возобновлять их. Инструмент разделяет большие файлы на несколько частей, чтобы использовать возобновляемую загрузку.

Uploadify

Uploadify

Это полностью рабочий загрузчик файлов на основе HTML5,который использует jQuery для улучшения пользовательского опыта. Он также доступен в версии для Flash.

Пожалуйста, оставьте свои отзывы по текущей теме статьи. Мы крайне благодарны вам за ваши комментарии, подписки, лайки, дизлайки, отклики!

Пожалуйста, оставляйте свои комментарии по текущей теме статьи. За комментарии, подписки, дизлайки, отклики, лайки огромное вам спасибо!

Читайте также: