Мини AJAX форма для загрузки файлов

HTML

Как обычно, мы начнем с основного документа HTML5:

Код
<!DOCTYPE html>
<html>
  <head>
  <meta charset="utf-8">
  <title>Mini AJAX форма для загрузки файлов</title>
  <link href="http://fonts.googleapis.com/css?family=PT+Sans+Narrow:400,700" rel='stylesheet'>
  <link href="assets/css/style.css" rel="stylesheet">
  </head>
  <body>

  <form id="upload" method="post" action="upload.php" enctype="multipart/form-data">
  <div id="drop">
  Перетащите сюда 

  <a>Просмотр</a>
  <input type="file" name="upl" multiple>
  </div>

  <ul>
  </ul>

  </form>

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
  <script src="assets/js/jquery.knob.js"></script>
  <script src="assets/js/jquery.ui.widget.js"></script>
  <script src="assets/js/jquery.iframe-transport.js"></script>
  <script src="assets/js/jquery.fileupload.js"></script>
  <script src="assets/js/script.js"></script>

  </body>
</html>

В заголовке документа, я включил два шрифта Google Webfonts, и перед закрывающим тегом тега вы можете видеть ряд библиотек JavaScript. Это JQuery библиотека, jQuery Knob и jQuery File Upload plugin.

Основной элемент на странице, является #upload form. Внутри это #drop div и неупорядоченный список. Этот список будет содержать пункты li для каждого из переданных файлов. Вы можете увидеть разметку, созданную для загрузки файла ниже:

Код
<li class="working">
  <input type="text" value="0" data-width="48" data-height="48" data-fgColor="#0788a5" data-readOnly="1" data-bgColor="#3e4043" />
  <p>Sunset.jpg <i>145 KB</i></p>
  <span></span>
</li>

Входной элемент в приведенном выше отрывке скрыт с помощью CSS. Его единственное назначение состоит в инициализации jQuery Knob plugin. Поле ввода имеет ряд атрибутов data-* , которые изменяют внешний вид Knob плагина.


JQuery код

Есть два способа загрузки файлов при помощи этой формы:

1) Это перетаскивание файлов с рабочего стола в окно формы (во всех браузерах, кроме IE);
2) Нажав на кнопку Обзор. Это будет имитировать нажатие на скрытые входной файл.

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

Код
$(function(){

  var ul = $('#upload ul');

  $('#drop a').click(function(){
  // Simulate a click on the file input button
  // to show the file browser dialog
  $(this).parent().find('input').click();
  });

  // Initialize the jQuery File Upload plugin
  $('#upload').fileupload({

  // This element will accept file drag/drop uploading
  dropZone: $('#drop'),

  // This function is called when a file is added to the queue;
  // either via the browse button, or via drag/drop:
  add: function (e, data) {

  var tpl = $('<li class="working"><input type="text" value="0" data-width="48" data-height="48"'+
  ' data-fgColor="#0788a5" data-readOnly="1" data-bgColor="#3e4043" /><p></p><span></span></li>');

  // Append the file name and file size
  tpl.find('p').text(data.files[0].name)
  .append('<i>' + formatFileSize(data.files[0].size) + '</i>');

  // Add the HTML to the UL element
  data.context = tpl.appendTo(ul);

  // Initialize the knob plugin
  tpl.find('input').knob();

  // Listen for clicks on the cancel icon
  tpl.find('span').click(function(){

  if(tpl.hasClass('working')){
  jqXHR.abort();
  }

  tpl.fadeOut(function(){
  tpl.remove();
  });

  });

  // Automatically upload the file once it is added to the queue
  var jqXHR = data.submit();
  },

  progress: function(e, data){

  // Calculate the completion percentage of the upload
  var progress = parseInt(data.loaded / data.total * 100, 10);

  // Update the hidden input field and trigger a change
  // so that the jQuery knob plugin knows to update the dial
  data.context.find('input').val(progress).change();

  if(progress == 100){
  data.context.removeClass('working');
  }
  },

  fail:function(e, data){
  // Something has gone wrong!
  data.context.addClass('error');
  }

  });

  // Prevent the default action when a file is dropped on the window
  $(document).on('drop dragover', function (e) {
  e.preventDefault();
  });

  // Helper function that formats the file sizes
  function formatFileSize(bytes) {
  if (typeof bytes !== 'number') {
  return '';
  }

  if (bytes >= 1000000000) {
  return (bytes / 1000000000).toFixed(2) + ' GB';
  }

  if (bytes >= 1000000) {
  return (bytes / 1000000).toFixed(2) + ' MB';
  }

  return (bytes / 1000).toFixed(2) + ' KB';
  }

});

jQuery File Upload библиотека работает с JQuery UI, для создания дизайна, которые можно использовать прямо сейчас. Тем не менее, потому что нам нужно полностью создать пользовательский интерфейс, мы будем использовать базовую версию плагина, который не включает в себя сам интерфейс. Чтобы заставить его работать, мы проходим ряд опций. В приведенном выше примере, а именно:

dropZone – Это свойство содержит JQuery селектор элемента, который будет выступать в качестве перетаскивания.

add – Эта функция обратного вызова вызывается при добавлении файла в очередь. Внутри него, мы создаем HTML разметку, которая будет представлять файлы, добавить его в UL и вызвать data.submit() метод.

progress – Этот обратный вызов выполняется с помощью плагина каждые 100 мс (настраивается). Второй аргумент (данные атрибутов) содержит размер файла и сколько байт было передано. Это позволяет рассчитать процент, а затем обновить скрытый элемент input, который в свою очередь, обновляет knob.

fail – Эта функция обратного вызова выполняется, если есть проблема с вашими PHP скриптом.

PHP скрипт

jQuery File Upload также поставляется с мощным PHP скриптом для обработки и загрузки файлов, которые вы можете поставить на свой сервер, но для этого урока, мы будем строить нашу собственную.

Код
<?php
$allowed = array('png', 'jpg', 'gif','zip');
if(isset($_FILES['upl']) && $_FILES['upl']['error'] == 0){
  $extension = pathinfo($_FILES['upl']['name'], PATHINFO_EXTENSION);
  if(!in_array(strtolower($extension), $allowed)){
  echo '{"status":"error"}';
  exit;
  }
  if(move_uploaded_file($_FILES['upl']['tmp_name'], 'uploads/'.$_FILES['upl']['name'])){
  echo '{"status":"success"}';
  exit;
  }
}
echo '{"status":"error"}';
exit;

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

Все готово!

Я надеюсь, что вы найдете применение нашему уроку!

  • FalleN

  • 3735

  • 1

  • 297
Теги: jQuery, upload, Form

Ссылки на статью:

Похожие статьи: