Главная > JavaScript > Загрузка файлов ajax с помощью JQuery.

Загрузка файлов ajax с помощью JQuery.

Downloads

Наконец то появилось время, и я оформил статью по теме онлайн загрузка файлов на сервер.
Для чего нам это нужно?
Если требуется загрузить не один файл, а много? Причем Flash технологиями пользоваться нельзя, или не хочется? А ждать обновления страницы после загрузки каждого файла, мягко говоря утомительно. Тогда нам на помощь приходит замечательный Ajax и не менее замечательный фреймоворк Jquery.

Для реализации задуманного, нам понадобятся 2 библиотеки JQuery

Скачать :
jquery.js
ajaxupload.js

Сразу же пример.

пример

Естественно в нем я не загружаю файлы к себе на сервер. Загрузку имитирую функцией

sleep("3");

Ну собственно код.

index.html

<html>
    <head>
        <title>Загрузка файлов Ajax с помощью Jquery</title>
        <script type="text/javascript" src="jquery.js"></script>
        <script type="text/javascript" src="ajaxupload.js"></script>
        <script type="text/javascript" src="script.js"></script>
    </head>
    <body>
        <div id="uploadButton" class="button">
            <font>Загрузить</font>
            <img id="load" src="loadstop.gif"/>
        </div>
        <ol id="files">
            Загруженные файлы :
        </ol>
    </body>
</html>

script.js

$(document).ready(function() {

      var button = $('#uploadButton'), interval;

      $.ajax_upload(button, {
            action : 'upload.php',
            name : 'myfile',
            onSubmit : function(file, ext) {
              // показываем картинку загрузки файла
              $("img#load").attr("src", "load.gif");
              $("#uploadButton font").text('Загрузка');

              /*
               * Выключаем кнопку на время загрузки файла
               */

              this.disable();

            },
            onComplete : function(file, response) {
              // убираем картинку загрузки файла
              $("img#load").attr("src", "loadstop.gif");
              $("#uploadButton font").text('Загрузить');

              // снова включаем кнопку
              this.enable();

              // показываем что файл загружен
              $("<li>" + file + "</li>").appendTo("#files");

            }
          });
    });

upload.php

$uploaddir = 'files/';
$uploadfile = $uploaddir.basename($_FILES['myfile']['name']);
move_uploaded_file($_FILES['myfile']['tmp_name'], $uploadfile)

Ну собственно и все. Все достаточно просто и незаурядно.

Скачать пример

Поделиться в соц. сетях

Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники
Опубликовать в Яндекс

JavaScript , ,

  1. Никита
    13 Авг 2009 из 12:30 | #1

    Пример в опере не работает)

  2. 13 Авг 2009 из 13:38 | #2

    Врешь =), Все работает и даже в IE работает.
    Какая Версия Оперы?

  3. 16 Окт 2009 из 12:41 | #3

    Пытаюсь этим скриптом загрузить файл размером 20Мб.
    Скрипт пишет – загружено, но в папке файл не появляется…
    Всю голову сломал…

  4. 16 Окт 2009 из 12:46 | #4

    А вы в php.ini указали максимально допустимый размер закачки файла и передачи POST запроса?

    Какие у вас там параметры?

  5. 16 Окт 2009 из 16:28 | #5

    @professor

    Через скрипт я указал:

    ini_set(‘memory_limit’, ’1024M’);
    set_time_limit(’1200′);
    ini_set(“max_execution_time”, “1000000″);
    ini_set(“upload_max_filesize”, “512M”);

    И все равно никак…

    А можно вообще как-то сделать, что-бы помимо

    Загруженные файлы :
    Route_end.wav

    еще отображалось содержимое страницы upload.php?

  6. 16 Окт 2009 из 16:57 | #6

    В каком смысле отображалось содержимое страницы?
    Не совсем понимаю что вы хотите.

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

  7. 16 Окт 2009 из 16:58 | #7

    Константин :
    @professor

    А можно вообще как-то сделать, что-бы помимо
    Загруженные файлы :
    Route_end.wav
    еще отображалось содержимое страницы upload.php?

    По первому вопросу все решилось…. А вот это все еще интересует, по поводу вывода аплоад.пхп

  8. 16 Окт 2009 из 17:00 | #8

    professor :
    В каком смысле отображалось содержимое страницы?
    Не совсем понимаю что вы хотите.
    Я попробовал, у меня файлы ваше 30Мб нормально загружаются.
    Скиньте мне на почту то что вы сделали(если это возможно), я попробую решить проблему.

    Ну например выдал upload.php текст по окончании выполнения, и вот как раз этот текст вывести под названием загруженного файла главной страницы…

    А может по асе? :) семь 9 три 9 восемь четыре 8

  9. 16 Окт 2009 из 17:22 | #9

    в данном варианте исполнения, этого нельзя сделать. сегодня-завтра посмотрю, и вам в асю напишу.

  10. 16 Окт 2009 из 17:48 | #10

    professor :
    в данном варианте исполнения, этого нельзя сделать. сегодня-завтра посмотрю, и вам в асю напишу.

    Спасибо ОГРОМНОЕ!!!

  11. Егор
    11 Ноя 2009 из 13:58 | #11

    использую модальную форму jqueryui. там у кнопок нет id (они задаются через параметры диалога)

    $('#dlgaddfoto').dialog({autoOpen:false,bgiframe:true,modal:true,overlay:backgroundColor:'#007',opacity:0.7},
     buttons:{
    "Добавить":function(){addFoto();$(this).dialog('close');},
    "Отменить":function(){$(this).dialog('close');}
    }
    });

    как быть?

  12. Magnum79
    13 Ноя 2009 из 16:08 | #12

    Привет !
    Использую, приспособил – нравится ! :)
    Решите пожаста 2 задачки и вам, как и загрузчику не будет равных :

    1. как проверять размер загружаемого файла не ПОСЛЕ а ДО(!!!) загрузки на сервер;

    2. немного не к месту, но может подскажете…я сделал после загрузки отображение на названия файла, а саму обработанную картинку. Всё бы ничего, но если jpg НЕДОГРУЖЕН (вобщем как-то испорчен), то вместо картинки появляется смачное warning с путями и названиями :). Ошибка в функции imgcreatefromjpg. Как сего грустного факта можно избежать ?

    Надеюсь на ответ ! Заранее спасибо…

  13. 13 Ноя 2009 из 21:58 | #13

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

  14. Magnum79
    14 Ноя 2009 из 15:06 | #14

    Доброго… !
    Вчера с перепугу решил 2-ую – стыд и позор, раньше недопер поставить @ перед ф-цией. :)

    Осталось главное. Помогите с определением размера файла без его загрузки на сервак, и я пропиарю ваш блог на своем сайте !
    Это последний на сегодняшний день “косякъ” в функционале, а все остальные “гуру-программеры” кроме как поглумиться и потупить более оказались ни на что не способные. Так что вся надёжа на вас… :)

  15. 14 Ноя 2009 из 17:08 | #15

    Отписался вам на почту. Стучите в аську.

  16. 25 Янв 2010 из 1:02 | #16

    Отвечаю по порядку:
    Константин

    еще отображалось содержимое страницы upload.php?

    Содержимое страницы находится в переменной response
    Magnum79

    Помогите с определением размера файла без его загрузки на сервак,

    upload.php

    $uploaddir = 'files/';
    if($_FILES["myfile"]["size"]<1000)
    {
    $uploadfile = $uploaddir.basename($_FILES['myfile']['name']);
    move_uploaded_file($_FILES['myfile']['tmp_name'], $uploadfile)}
  17. Ignat
    26 Янв 2010 из 2:49 | #17

    Здравствуйте, возможно ли сделать загрузку не с компьютера пользователя, а вписав url файла на другом сервере? т.е. грубо говоря, чтобы у нас было не input type=file, а типа input type=text и этот введенный текст отсылался бы обработчику

  18. Igor
    01 Фев 2010 из 19:13 | #18

    Спасибо автору, нужно было срочно реализовать подобную загрузку :)

  19. Evgen
    02 Фев 2010 из 19:01 | #19

    Не поскажете как сделать чтобы можно было выбирать только jpg файлы

  20. Evgen
    02 Фев 2010 из 21:13 | #20

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

  21. 02 Фев 2010 из 23:59 | #21

    Igor пожалуйста.

    Evgen
    1) проверка на jpg.
    Проверять нужно по расширению. Можно и по типу фала, но каждый браузер передает разный тип одного и того же файла.
    тип можно смотреть в этой переменной $_FILES["myfile"]["type"]
    upload.php

    $uploaddir = ‘files/’;
    $name=basename($_FILES['myfile']['name']);
    $uploadfile = $uploaddir.$name;

    $error=null;
    if($_FILES["myfile"]["size"]>1000)
    $error="Файл не загружен, так как его размер превышает допустимый.";

    if(preg_match("#.*?\.jpg$#i",$name))
    $error="Файл не загружен, так как его формат не допустим.";

    if($error==null){
    echo !move_uploaded_file($_FILES['myfile']['tmp_name'], $uploadfile)?"Ошибка при загрузке файла.":$name;
    }else{
    echo $error;
    }

    в JS ответ будет присвоен переменной response

    P.S. Писал в браузере, так как нет возможности протестировать. Если что то не будет работать спрашивайте.

  22. Evgen
    03 Фев 2010 из 8:57 | #22

    Спасибо большое за ответ, только в данном примере, допустим, если первый файл загрузился удачно upload.php вернул ответ и поставил его в контейнер 1, а сели ошибка, то ответ должен встать в контейнер 2. Т.к. некарасиво получается допустим вернулся удачный ответ в виде картинки потом в этот же контейнер вернулась ошибка и все это висит

  23. Evgen
    03 Фев 2010 из 9:08 | #23

    Блин, пардон все элементарно! Вот вдруг кому нибудь пригодится:

    if (response==’Ошибка’){
    $(‘#error’).append(response);
    } else {
    $(‘#files’).append(response);}

    И еще приделать бы сюда удаление ошибочно загруженых файлов вообще цены бы не было!

  24. 03 Фев 2010 из 15:35 | #24

    Ну удаление ошибочных файлов, это уже совсем другой разговор.
    =)
    Как время будет, напишу

  25. Evgen
    04 Фев 2010 из 9:31 | #25

    Неизвестная аномалия в IE7 при наведении на загрузку под курсором почемуто возникает белый прямоукольник и перемещается за курсором в пределах этого контейнера

  26. Oksana
    25 Март 2010 из 18:40 | #26

    А как можно передать каки-нибудь дополнительные параметры в обрабатывающий скрипт upload.php и как их там можно извлечь? )

  27. 25 Март 2010 из 19:25 | #27

    А можно поинтересоваться зачем? Просто интересно где это требуется?

    Сегодня-завтра посмотрю и сообщу тут.

  28. 26 Март 2010 из 0:11 | #28

    На самом то деле параметры передать очень легко, по средствам GET=)

    $.ajax_upload(button, {
    action : ‘upload.php?parametr=tut_znachenie_parametra’,

  29. Oksana
    31 Март 2010 из 17:23 | #29

    Спасибо) но я уже для передачи доп параметров использовала атрибут data, по-моему он для этого сюда специально и включен:

    $.ajax_upload(button, {
    data : {param:’1′},

    А параметры мне необходимы для того чтобы данные о загруженных файлах записывать в БД ))

  30. Doctor
    07 Апр 2010 из 17:00 | #30

    Привет! Спасибо, заработало с первого раза, вещь! Сэкономило кучу времени и нервов! А как избавиться от белого прямоугольника, который поверх всего слева выплывает, может кто уже решил?

  31. 07 Апр 2010 из 17:52 | #31

    Ну во первых перестать пользоваться IE =)
    А во вторых, можно в качестве кнопки загрузки не использовать div
    тоесть вместо этого

    <div id="uploadButton"  class="button">
      <font>Загрузить</font>
      <img id="load" src="loadstop.gif"/>
    </div>

    написать нечто такое

    <div class="button">
      <input type="button"  id="uploadButton" value="Загрузить">
      <img id="load" src="loadstop.gif"/>
    </div>

    Ну или что то в этом роде. Тут можно поэксперементировать.

  32. Porter
    27 Апр 2010 из 17:52 | #32

    Здравствуйте!
    А можно ли как то запретить выполнение этой функции в зависимости от заполнения другого поля? т.е. если то поле пустое – запретить нажатие на кнопку – и появление сообщения, и появление окна загрузки только если то поле не пустое?

  33. Oksana
    28 Апр 2010 из 12:53 | #33

    А как можно передать параметры, которые заранее неопределены, а зависят от действия пользователя?

  34. Виктор
    20 Июль 2010 из 11:43 | #34

    Пожалуйста подскажите:
    что если много разных полей с разными id, а ваш пример сделан под одну кнопку загрузки, тоесть:

    загрузить
    загрузить

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

  35. Дмитрий
    15 Окт 2010 из 10:50 | #35

    Не могу загрузить файлик на 300мб.
    Верху говарилось про php.ini как и куда добавить критерий на размер файла

  36. 15 Окт 2010 из 11:01 | #36

    В php.ini нужно у
    upload_max_filesize
    поставить нужный максимальный размер
    upload_max_filesize = 600M

  37. 09 Дек 2010 из 18:00 | #37

    Несмотря на выставленный параметр:
    name : ‘C:\\Users\\Diana\\Documents\\Материалы\\HTA\\work\\inv\\User.inf’,
    выходит запрос от windows “Выбор файла на выгрузку”.

    Что посоветуете?
    Хотелось бы отправить файл молча.

    С уважением KVP.

  38. 09 Дек 2010 из 23:41 | #38

    Такая проблема. мне нужно несколько раз использовать данную функцию. Т.е.

    [form]

    [download1]

    [download2]

    [download3]

    [/form]

    Как организовать так, чтобы при нажатии на download1..download3 механизм работал, и чтобы скрипт запускать в виде функции типа
    к примеру

    UploadFunction(download1,’jpg|gif’,param2);
    UploadFunction(download2,param1,param2);
    UploadFunction(download3,param1,param2);

  39. iF
    24 Дек 2010 из 7:56 | #39

    Доброго времени суток! Неплохая статья )))
    Но как говорится нужно жить в ногу со временем ))
    Сейчас на сайте автора доступна новая версия плагина http://valums.com/ajax-upload/

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

    Как задать в этом плагине надпись для кнопки??? Подскажите пожалуйста )))
    Я так понимаю автором это не реализовано ((( Отсюда вижу только один выход – нужно усовершенствовать сам плагин, добавив в него входящий параметр допустим (nameButton), но как это сделать безболезненно не хватает знаний ((( Подскажите пожалуйста умные люди ))))

  40. 24 Дек 2010 из 13:07 | #40

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

    Вам будет интересна другая моя статья http://n-professor.ru/massovaya-zagruzka-fajlov-na-server-pri-pomoshhi-flash.html

  41. iF
    24 Дек 2010 из 16:31 | #41

    @ professor

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

    Подскажите только, как вывести на страницу (допустим рядом с
    // показываем что файл загружен
    $(“” + file + “”).appendTo(“#files”);) данные с php обработчика.
    У меня в о обработчике происходит довольно много операций с картинкой (это и наложение водяного знака, создание превьюшки, запись в mysql и пр.) то есть большая вероятность закончить загрузку ошибкой ((((

    Как довести данную полезную информацию до пользователя?

  42. iF
    24 Дек 2010 из 16:33 | #42

    я имею ввиду, закончились ли все махинации с файлом успехом или произошли некоторые ошибки!
    Просто JS ответа вроде
    // показываем что файл загружен
    $(”” + file + “”).appendTo(”#files”);) данные с php обработчика.
    на мой взгляд недостаточно ((((

  43. 24 Дек 2010 из 16:37 | #43

    при возникновении ошибки выводите ее на экрен
    echo “Тут произошла ошибка”;

    Эта строчка доступна в функции
    onComplete : function(file, response) {}
    В переменной response

    То есть можно вывести допустим через alert

  44. iF
    24 Дек 2010 из 16:42 | #44

    @ professor

    Спасибо ))) Очень помог )))
    С Php то я на ‘ты’, там проблем нет )), а вот c js, пока не очень ))) недавно изучаю.

  45. iF
    24 Дек 2010 из 16:43 | #45

    @ iF
    Все идеи реализованы ))) Спасибо еще раз!!!

  46. Максим
    10 Янв 2011 из 6:38 | #46

    Здравствуйте.
    Похожий вопрос уже был.
    Спрошу еще раз…
    На странице 6 полей для загрузки фото.
    У каждого поля свое name.

    Как сделать чтобы этот скрипт работал для каждого поля в отдельности и в php передавались соответствующие названия форм?

  47. 10 Янв 2011 из 13:28 | #47

    Если честно то я не знаю.
    По моему единственный выход это дублирование кода.
    var button1 = $(‘#uploadButton1′), interval;
    var button2 = $(‘#uploadButton2′), interval;
    $.ajax_upload(button1, …
    $.ajax_upload(button2, …

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

  48. 10 Март 2011 из 22:23 | #48

    Подскажите плз, а как реализовать к этому примеру прелоадер с процентом загрузки?
    Спасибо, сам метод оч удобный в использовании)

  49. 12 Март 2011 из 4:36 | #50

    http://valums.com/ajax-upload/

    А что можете по этому примеру сказать?

  50. 12 Март 2011 из 12:01 | #51

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

    Спасибо за наводку. Обязательно попробую в своих проектах.

Страницы комментариев
  1. Трекбеков пока нет.