Git Product home page Git Product logo

damnuploader's Introduction

damnUploader

jQuery file upload plugin. Simplifies AJAX files uploading and client-side file management routines.

Features:

  • works through HTML5 File API in modern browsers
  • has built-in feature detection, that gives ability to realize graceful degradation in older browsers
  • drag & drop
  • multiple files selecting
  • base MIME type checking
  • file reading
  • creating uploads from custom data

Demo

Complex, well commented demo available in ./demo-bootstrap. Also, you can view it online. It based on twitter bootstrap and contains examples for all most useful cases.

Installing & Using

Just include plugin code (jquery.damnUploader.js) to your page, after jQuery lib.

In most simple case, you need to init uploader on file input field:

var $fileInput = $('#file-input').damnUploader({
    url: '/ajax-file-upload-handler'
});

... and call duStart() method in some event handler (for ex., when form is submitted):

$('#file-form').submit(function(e) {
    $fileInput.duStart();
    e.preventDefault();
});

To explore a wider range of possibilities, see API description and demo.

API

Init parameters

url: URL to upload (default: '/upload.php'). Every upload will be performed in a separate request.

multiple: allows to select several files (default: true)

fieldName: sets file field name. For ex., it will be used as index in $_FILES when upload handled by PHP. (default: 'file')

dropping: switch on drag&drop functionality (default: true)

dropBox: container for drag&drop. You may pass selector or jQuery chained object (default: false)

limit: used to limit count of files to put in queue (default: false, means no limit)

dataType: expected response type, 'text' or 'json' (default: 'text')

method: HTTP method, 'POST' or 'PUT' (default: 'POST')

acceptType: accepted MIME type (for example: 'image/*' or 'image/png'; default: null - accept all)

Methods

duStart() - Start queued files uploading

If you prefer start upload immediately after file added, you doesn't need to call this method, you can call UploadItem.start() instead (see desc. below), for example, when 'du.add' event fired.

duCancel(queueId) - Cancel upload by it id

We recommend to use UploadItem.cancel() method instead (see desc. below)

duCancelAll() - Cancel all queued files uploading and clear queue. Active uploads will be canceled too

duEnqueue(item) - Adds some data (it may not be a File object necessarily, see duNewUploadItem() method desc.) to upload queue

Use this method, if you want to add custom data to upload as file. Method can interpret not only File or File-compatible objects. In case of given argument is not File-compatible, will attempt to convert it into such, according to the rules described in duNewUploadItem() method description (see below).

duGetQueue() - Returns all queued items in hash like {uploadID: uploadItemObject}

duCount() - Returns count of queued items

duOption(name, value) - Change some option value

'url', 'fieldName', 'limit', 'dataType', 'method' are changeable

duNewUploadItem(fileOrData) - Creates UploadItem object from some data, according to the following rules:

  • if arg is already instance of UploadItem, it will be returned as is
  • if arg is File-compatible object (window.File and window.Blob are), creates UploadItem with data & type contained inside it
  • if arg is dataURI, parses it and creates UploadItem with defined data & type
  • in other cases tries to call toString() method and create blob with type 'text/plain', then creates UploadItem from it

UploadItem object, created by this method may be customized and then added to upload queue or uploaded instantly by calling it upload() method. duEnqueue() calls this method independently, if needed.

duIsAcceptedType(mime) - Check that passed MIME type string matches defined in 'acceptType' property

Events

Events handlers may be attached by jQuery event API methods:

$fileInput.on('du.add', function(e) { console.log('File added: ' + e.uploadItem.file.name); });

du.add - fired when file is selected

In case of multiple files were selected, triggers separately for each file. UploadItem object can be accessed from event object (it has property uploadItem). You can reject file by calling event.preventDefault(). If you want to start uploads immediately, you could cancel default action (enqueueing file) by event.preventDefault() and start upload by calling event.uploadItem.upload()

du.limit - fired when count of files exceeded defined limit, but user tries to add more files

du.completed - fired once when all uploads completed

Every UploadItem object has own complete callback (see UploadItem desc.)

UploadItem object

Special object, that represents single item to upload (it may not necessarily be a real file).

Fields:

file - contains window.File object if assigned

fieldName - upload field name

replaceName - name to replace original file name

progressCallback - function to call on upload progress is updated. Current progress state (in percents) passed as argument

completeCallback - function to call when upload completed. Passed arguments: successFlag, recievedData, httpStatusCode. Example:

$fileInput.on('du.add', function(e) {
    console.log('File added: ' + e.uploadItem.file.name);
    e.uploadItem.completeCallback = function(succ, data, status) {
        console.log(this.file.name + " was uploaded. Recieved data: ", data)
    };
});

Methods:

id() - returns unique item id

addPostData(data) - adds some data to post with upload (multiple fields as plain object)

e.uploadItem.addPostData({ hello: 'world' });

addPostData(name, value) - adds some data to post with upload (single field)

e.uploadItem.addPostData('hello', 'world');

upload() - start upload. You not need to call this method when duStart() method is used

cancel() - cancel upload and remove item from queue

readAs(format, callback) - read file as defined format and pass data to callback. Possible formats are: 'Text', 'DataURL', 'BinaryString', 'ArrayBuffer'. Example:

e.uploadItem.readAs('Text', function(data) {
    console.log("file contents:", data);
});

Feature detection

Plugin adds several flags to $.support object:

fileSelecting - false if there's no way to handle file selection, and thus to control uploading

fileReading - false if there's no possibility to read files (method readAs() will always return null)

uploadControl - false if can't retrieve progress data. UploadItem's progressCallback will be called once with value of 100%

fileSending - false if browser doesn't support file API

Example:

$('#form-with-files').submit(function(e) {
    if ($.support.fileSending) {
        // if browser supports, start uploading by plugin
        $fileInput.duStart();
        e.preventDefault();
    }
    // else - form will be sended on default handler, defined in it's "action" attribute
});

Browser support

Supported in all modern browsers that supports file API. See details at caniuse.com.

damnuploader's People

Contributors

0x4e69676874466f78 avatar safronizator avatar yar3333 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

damnuploader's Issues

Некорректно отрабатывает multiple: false

Если указать multiple: false , то возникает ошибка в случае попытки повторной загрузки одиночного файла потому что срабатывает условие:
if ($this._duItemsCount === set.limit) {
$this.trigger(limitEvent);
return false;
}

Соответственно гасится возможность повторного аплоада одиночного файла.
Пофиксил у себя так:
if (set.limit > 1 && $this._duItemsCount === set.limit) {

Метод cancel

Добрый день, скажите пожалуйста. Если я делаю вот так вот, должны элементы удалятся из очереди?
$i.on('du.add', function(a) {
a.uploadItem.cancel();
});

Они почему-то у меня не удаляются.

Добавление данных в $_FILES

Ситуация 1. Пользователь выбирает каталог на сервере в веб-интерфейсе и загружает в него файл.
Ситуация 2. Создается запись в БД о файле с его именем и другими данными, о которых знает только js-скрипт.

В этих случаях серверному скрипту понадобится не только сам файл, а так же сопутствующие данные. Как их добавить в $_FILES?

$fileInput.duStart is not a function

I have(for example):

  <script>
       var $fileInput = jQuery("#file-input");
       function send_click() {
          $fileInput.duStart();
       }
  </script>
  <form><input id="file-input"/><a onclick="send_click()">SEND</a></form>
  <script>
       $fileInput..damnUploader({
            url: 'uploadify.php',
    	fieldName: 'Filedata'
      });
  </script>

and after click SEND i have error:

$fileInput.duStart is not a function

more error, if:

      console.log(jQuery('#file-input').prop('multiple'));
      var $fileInput = jQuery('#file-input').damnUploader({
             url: '/js/uploadify.php',
        fieldName: 'Filedata'
      });

then console.log(...) return true, but after damnUploader return error:

$this.prop(...).on is not a function

Клик по контейнеру для перетаскивания файлов открывает окно выбора файлов

Сделайте пожалуйста такую возможность:
Клик по контейнеру для перетаскивания файлов открывает окно выбора файлов, т.е. работает также, как кнопка Обзор...
От кнопки Обзор... можно избавиться, достаточно одного кликабельного драгэндропа, спасибо!

Неудобный queueId

Пытаюсь сделать сохранение и восстановление очереди в БД и queueId доставляет значительные неудобства. Было бы лучше, если бы он обозначал порядковый номер элементов в очереди, тогда бы в БД не пришлось заводить отдельное поле с ид элемента, а использовать уже существующее, в котором сохраняется порядок следования.

Не работают методы duGetQueue(), duCount()

Я использую загрузку по нажатию отдельной кнопки, а не сразу при выборе файла. После выбора файла функция $fileInput.duCount() возвращает 0, а $fileInput.duGetQueue() - пустой объект. Насколько я понял, так не должно быть.

Есть ли возможность добавить текстовые данные для их отправки к полю выбора файла? Если я правильно понял, то это можно сделать с объектом UploadItem во время выбора файла, а мне нужно, чтобы в любой момент. Можно ли как-то получить доступ к UploadItem уже после того, как отработала функция fileAddHandler (если говорить о демке) ?

Обновление миниатюр с сервера

Если браузер не поддерживает FileReader, то пользователь так и не увидит загруженные файлы. Было бы логично изменить демку таким образом, чтобы при успешной загрузке миниатюра из data.url заменялась бы миниатюрой загруженной картинки

Невозможно повторно загрузить файл, удаленный из очереди, а так же удалить отсеянный файл

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

Кнопочка отмены загрузки файла.

Как мне кажется, когда файл уже успешно загружен, то кнопочку отмены (крестик) следует заменить допустим на зелененькую галочку. Что там уже можно отменять когда он уже загружен...? ;-) Если только удалять и отменять все сделанные этим файлом изменения...

duStart VS upload

Хочу сделать чтобы при добавлении файлов они автоматом закачивались, и потом вызывался completed но при использовании ui.upload() этот колбек не вызывается, а работает он только если делать duStart на отдельную кнопку.

Где перехватить окончание добавления файлов в очередь, чтобы вызвать duStart?

Избыточная загрузка

Если в interface.js после помещения в очередь
javascript var queueId = fileInput.damnUploader('addItem', uploadItem);
дописать
javascript fileInput.damnUploader('startUpload');
чтобы файл сразу же загружался на сервер, а потом щелкнуть быстро на svn-прямоугольник, то файл загрузиться на один раз больше и листинг будет представлять следующее:

Файл `undefined` загружен, полученные данные:
*****
Contents of $_FILES:
Array
(
    [my-pic] => Array
        (
            [name] => blob
            [type] => image/png
            [tmp_name] => /tmp/phpnW3O50
            [error] => 0
            [size] => 858
        )

)

*****
Файл `undefined` загружен, полученные данные:
*****
Contents of $_FILES:
Array
(
    [my-pic] => Array
        (
            [name] => blob
            [type] => image/png
            [tmp_name] => /tmp/phpZ0XM1J
            [error] => 0
            [size] => 858
        )

)

*****
*** Все загрузки завершены! ***
*** Все загрузки завершены! ***
Файл `undefined` загружен, полученные данные:
*****
Contents of $_FILES:
Array
(
    [my-pic] => Array
        (
            [name] => blob
            [type] => image/png
            [tmp_name] => /tmp/phpcC9qu0
            [error] => 0
            [size] => 858
        )

)

*****
Картинка добавлена: `undefined` (1 Кб)
Картинка добавлена: `undefined` (1 Кб)

Тут нужно или как-то по-другому реализовывать загрузку сразу после добавления или в плагине делать проверку

Порядок загрузки файлов

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

Заранее спасибо за любой ответ и конечно за отличный скрипт!

Кнопка "Удалить"

Отличный плагин, еще вот не хватает кнопки "Удалить", которая не просто в html удаляет верстку, но и сам файл с сервера, будет супер!

Последовательная загрузка файлов

Как заставить скрипт загружать файлы не одновременно, а друг за другом. Пытался использовать each и timeout, но это решение совсем не надежно. А отловив completeCallback на отдельном файле не понятно как его можно использовать. Может есть действительно рабочий метод сделать это?

Много инпутов на одной странице

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

Имя картинок

в файле interface.js в переменной file.name содержится оригинальное имя картинки. а в serverLogic.php когда сохраняется картинка генерируется новое имя. вопрос в том как мне получить новое имя файла после загрузки назад в скрипт interface.js. Просто я добавил кнопку на аваторку и при нажатии должна ставиться на аву, но с именем который сгенерировался в php, а не оригинальным.

Новая демонстрация

Сделал на основе свою демонстрацию:
http://tamtakoe.ru/damnUploaderDemo/

На ней, кстати хорошо видны проблемы с загрузкой лишних файлов, при множественном выборе и проблема со скачущим прогресс-баром

Не работает setParam

не работает метод setParam({url:...})

Индексы массива начинаются с НУЛЯ, поэтому URL всегда выпадает из условия (его индекст = 0)

В итоге метод не срабатывает:

me.uploader.damnUploader("setParam", {
url: me.getUrl()
});

Типы загружаемых файлов

Привет!
Все хорошо, но хотелось бы ограничивать типы загружаемых файлов, например, только изображения (указывать определенные форматы).

Дополнительные опции

Здравствуйте! Спасибо за плагин!

Не хватает опций:

method: POST || PUT
Чтобы было совместимо с протоколом RESTfull.

params: {}
Помимо имени файла на сервер нужно передавать дополнительные параметры. Опять-таки, это косвенно связано с RESTfull.

Не хватает плагина не для jQuery, а для Ext JS 4.x.x.

Восстановление после ошибки Unexpected end of JSON input

Если колбек с сервера отдает не JSON то получаем это

Uncaught SyntaxError: Unexpected end of JSON input
at JSON.parse (<anonymous>)
at Function.m.parseJSON (jquery.1.11.1.min.js:4)
at XMLHttpRequest.n.onreadystatechange (jquery.damnUploader.min.js:1)

Как потом почистить очередь чтобы загружать дальше файлы?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.