За последние 24 часа нас посетили 16790 программистов и 1643 робота. Сейчас ищут 872 программиста ...

динамическая загрузка изображений на сервер

Тема в разделе "JavaScript и AJAX", создана пользователем harek13, 4 ноя 2010.

  1. harek13

    harek13 Активный пользователь

    С нами с:
    4 ноя 2010
    Сообщения:
    26
    Симпатии:
    0
    доброе время суток.
    хотел попросить помощи - стоит задача создать функцию, позволяющую загружать картинки на сервер.
    при нажатии кнопки добавить выбирается картинка и появляется ее миниатюра(предпросмотр). облазил уже много сайтов но не нашел достойного мануала как это все можно реализовать. есть много всякого - но нужно без флеша. буду признателен любой помощи.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    <input type="file"> :D

    В чем затык?
     
  3. harek13

    harek13 Активный пользователь

    С нами с:
    4 ноя 2010
    Сообщения:
    26
    Симпатии:
    0
    загрузить я могу - это не проблема. нужно чтобы загрузка была динамическая то есть как только через инпут мы выбрали оно(изображение) сразу загружается на сервер и появляется миниатюра. возможно нужно реализовать через джуквери но я не могу найти как. вот и в поисках святого грааля))
     
  4. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    В 13 лет святым граалем должны быть сиськи подружки, а не jQuery
     
  5. harek13

    harek13 Активный пользователь

    С нами с:
    4 ноя 2010
    Сообщения:
    26
    Симпатии:
    0
    с чего Вы взяли что мне 13 лет? только по нику что ли?)))

    не хочу разводить бесполезной демагогии хотелось бы получить здесь хоть какой то помощи. чета у меня не получается толково загуглить вот и обращаюсь к тем кто уже сталкивался с такой проблемой. буду благодарен любому содействию.
     
  6. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    harek13
    Повесь onchange событие на элемент
     
  7. harek13

    harek13 Активный пользователь

    С нами с:
    4 ноя 2010
    Сообщения:
    26
    Симпатии:
    0
    не совсем понял как это решит мою проблему. если не трудно можете немного разъяснить?
     
  8. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    Тема сисек так и не раскрыта. Не оффтопте :)
     
  9. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Apple, Апельсин, лучше дайте хорошую ссылку, как с помощью XMLHttpRequest - объекта грузить файлы на сервер. Я бы тоже почитал...
    Кстати вот такое по теме:
    [js]var xmlHttp = false;
    if(window.XMLHttpRequest)
    xmlHttp = new XMLHttpRequest();
    elseif(window.ActiveXObject)
    xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    if(xmlHttp) {
    // do anything
    }[/js]
    будет работать во всех более-менее современных браузерах со включенным JavaScript или есть браузеры, где этот объект создаётся ещё как-то по-другому?
     
  10. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    вытащи из любого фреймворка функцию которой он создается
     
  11. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    sobachnik
    на обычном js даже нет желания чтото большое писать. раньше на jsHttpRequest делал, сейчас на jQuery и не парюсь.
     
  12. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Апельсин А у меня почему-то радикально противоположное желание :) Никаких фреймворков, ничего готового, только чисто на js...
     
  13. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    sobachnik
    когдато я тоже такого придерживался. потом понял, что за 10 мин и десяток-второй строчек с джиквери можно сделать такую штуку, на которую бы ушло час возни и кучи говнокода со всякими фиксами багов.
     
  14. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Апельсин, с одной стороны я с тобой согласен. Конечно, так удобнее и проще, но у меня на даче старенький комп Pentium III 700 MHz, 256 MB RAM и когда к веб-страничке подключается какой-то фреймворк (а это по-любому несколько тысяч, и, скорее всего, несколько десятков тысяч строк JavaScript кода), то браузер начинает подтормаживать при загрузке страницы и отжирать много памяти... Я, конечно, понимаю, что сейчас ориентироваться на такие компы, в общем-то не особо актуально, но сам пока стараюсь не подключать к страничке ничего лишнего... Только тот js функционал, который реально нужен на данной странице. Наверно, это пройдёт с покупкой нового ноута для дачи :)))
     
  15. Апельсин

    Апельсин Активный пользователь

    С нами с:
    20 мар 2010
    Сообщения:
    3.645
    Симпатии:
    2
    sobachnik
    да, там куча кода, который ты при работе с сайтом можешь на 10% всего использовать и как бы остальные 90% зря грузятся. Но получаешь быстроту написания и хоть какуюто относительную стабильность при просмотре в ишаке и мозилле.
    Когда jquery юзают только при надобности, а не для подсветки каждой кнопки и буквы - тогда тормозить не должно. Иначе, тому железу место в музее.
    В джиквери постарались чтобы отделить хтмл от js (сохраняя простоту доступа к элементам DOM), то есть при грамотном написании в страничке может вовсе не быть ни одной строки кода на js. Почитай книгу "jQuery в действии", поменяешь мнение скорей всего.
     
  16. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    кешируйте
     
  17. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Апельсин, Спасибо. Возможно поменяю и стану им пользоваться, но мой любопытствующий характер, скорее всего, заставит меня сперва долго-долго сидеть и вникать во внутренности jQuery :) На данной стадии моего развития мне ещё интересно вникать в то, что происходит при обращении к каким-то функциям сторонних классов и наборов функций :) Но предвижу, что это долго и нудно, с бесконечным перепрыгиванием от одной функции к другой, от одного метода или класса к другому, с нудным поиском по файлам где и что и как написано, так как скорее всего вызываемые в конечном скрипте функции jQuery будут ссылаться на другие функции, методы, свойства, а те в свою очередь использовать ещё другие и т.д... и пока всё найдёшь и поймёшь как всё это реально работает - мозг вскипит. Я пробовал так "докопаться до истины", когда правил сайтик, использующий фреймворк "Yahoo" (или "yui"). Офигел несколько раз подряд пытаясь найти что же происходит при обращении всего-то к одной единственной функции из множества там имеющихся.
     
  18. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    По-моему браузер тупит не из-за загрузки файлов (т.е. не из-за времени, которое передаются эти js-файлы по сети), а из-за времени, расходуемого на разбор/анализ/компиляцию js-кода... Я не знаю, в js можно сделать так, чтобы подключенные js скрипты не разбирались и компилировались браузером заново при каждом клике по ссылке на другую страничку с теми же подключенными скриптами, а сохранялись в кэш в уже скомпилированном виде...
    Хотя, возможно, я только что вообще бред написал, не понимая того, как браузер с js работает :)
     
  19. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    sobachnik
    он же интерпретируемый язык
     
  20. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Да никак.
    Делай через фреймы: при выборе сабмит фрейма, потом со стороны РНР получает JS код и его выполняем через eval.
     
  21. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ну да, понятно. Но ведь всё равно, чтобы компьютер (процессор) выполнил какие-то команды, описанные на javaScript - этот исходный js код должен быть каким-то образом преобразован браузером в набор команд для процессора, в машинный код. Или не так? Я, честно, не знаю, так ли это, я написал свои мысли просто. Но если так, то получается, что при каждой перезагрузке страницы, к которой подключен фреймворк типа Yahoo или jQuery (а это 20...30+ тысяч строк js кода) браузер сперва должен провести синтаксический анализ всей этой текстовой писанины, проверить на ошибки, чтобы там точки с запятой стояли на своих местах и пр., потом сделать из этого текста некий набор битов, "понятный процессору". И вот этот процесс анализа/интерпретации кода может занимать некое время на старых машинах, если кода очень много, вот о чём я.
    Я не уверен, что это на самом деле так, но просто на практике замечаю, что когда к страничке подключено очень много javaScript, то браузер некое время при загрузке странички тупит (и в это время, обычно 2-3 секунды, программка Auslogics BoostSpeed показывает загрузку CPU = 100%). Потом всё становится нормально, только оперативной памяти лишних 20...30 Мб (а то и более) браузер съедает.
    Я не собираюсь отговаривать людей от фреймворков, от jQuery, да это и глупо было бы, наверно. Просто вот лично мне (на данный момент) как-то хочется, чтобы к web-странице было подключено ровно столько javaScript, сколько реально используется на данной конкретной странице. Но это, наверно, не основное, почему я не хочу использовать готовое. Основное - мне пока ещё интересно самому писать (в том числе и на js) весь функционал сайта. Полностью. В крайнем случае можно покопаться в том же jQuery и скопипастить оттуда несколько нужных мне на этой странице функций, но не подключать его полностью.
    И даже если я буду подключать его полностью, в том виде, каким его предлагают его разработчики - то сперва я, естественно, захочу не только узнать, какие в нём есть методы и как ими пользоваться, но и увидеть и понять, как эти методы и функции устроены изнутри...
    Но это я уже совсем не в ту степь уехал, кажется :)
    Кстати, ведь php - тоже интерпретируемый язык? Однако можно сделать так, чтобы сервер хранил не только сами текстовые php-скрипты, но и готовый машинный код, вытекающий из этих скриптов... И при обращении к той же, скажем index.php не запускался заново процесс анализа текста скрипта, а грузился уже заранее преобразованный в машинный код набор инструкций для сервера. Я недавно только где-то здесь на этом форуме об этом читал, правда не помню где именно...
    Вот это жаль, конечно, если так... я надеялся, что есть способ, так как вот как раз сейчас передо мной встала задача сделать загрузку фотографий на сайт без перезагрузки странички. Думал, что ajax (и, конкретно, объекта XMLHttpRequest) будет достаточно...
     
  22. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    harek13

    Идея такова.

    <form action="/image_upload.php" method="POST" target="image_frame">
    <input type="file" name="image">
    </form>

    <iframe name="image_frame" style="display:none;"></iframe>

    В image_upload.php обрабатываешь изображение, создаёшь миниатюру, обратно возвращаешь javascript код с сылкой на миниатюру, который вставляет в код страницы элемент <img>

    Реализовывал примерно такое же, но при загрузке нескольких изображений нужно динамически менять форму, динамически создавать iframe для каждой отправки, ну и кода чуть больше.
     
  23. harek13

    harek13 Активный пользователь

    С нами с:
    4 ноя 2010
    Сообщения:
    26
    Симпатии:
    0
    люди это все хорошо. может кто нибудь поможет мне?)) я понимаю что это все очень легко реализуется. но все же у меня не получается - может кто нибудь покажет на примере как это все происходит? или хотя бы полезной ссылкой?
     
  24. harek13

    harek13 Активный пользователь

    С нами с:
    4 ноя 2010
    Сообщения:
    26
    Симпатии:
    0
    Gromo
    можешь поделиться кодом если не жалко? буду при многом благодарен. потому что все говорят что легко это легко - я уже несколько дней ищу реализацию или толковый мануал но ничего не вижу. хотя это используется на многих сайтах.
     
  25. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    [js]<script type="text/javascript" src="js/jquery.js"></script>
    <script type="text/javascript">
    function file_upload() {
    if (typeof file_upload.guid == 'undefined') {
    file_upload.guid = 0;
    }
    file_upload.guid++;
    $('<iframe name="file_upload_target_' + file_upload.guid + '" src="javascript:void(0);" style="display:none;"></iframe>')
    .attr('id', 'file_upload_target_' + file_upload.guid)
    .attr('name', 'file_upload_target_' + file_upload.guid)
    .appendTo('body');
    $('#file_upload_form').empty();
    $('#file_upload_input').removeAttr('id').attr('name', 'upload_file').appendTo('#file_upload_form');
    $('#file_input').prepend('<input type="file" id="file_upload_input" onchange="file_upload();">');
    $('#file_input').append('<div id="file_loading_icon_' + file_upload.guid + '" style="margin-top:10px; clear:both;">
    <img src="/s/static/img/loading.gif" /> loading...</div>');
    $('#file_upload_form').attr('action', '/upload.php?guid=' + file_upload.guid)
    .attr('target', 'file_upload_target_' + file_upload.guid).submit();
    }

    function onfileupload(data) {
    var content = '<div style="float: left; padding: 10px; text-align: center; width: 100px;">';
    content += '<input type="hidden" name="ad_image" value="' + data.filename + '^' + data.title + '">';
    content += '<img src="/images/uploaded/' + data.filename + '.thumbnail" /><br />';
    content += data.title;
    content += ' (<a href="javascript:void(0);" onclick="$(this).parent(\'div\').remove();">remove</a>)';
    content += '</div>';
    $('#uploaded_images').append(content);
    $('#file_loading_icon_' + data.guid).remove();
    $('#file_upload_target_' + data.guid).remove();
    }
    </script>[/js]

    HTML:
    1. <div id="file_input">
    2.   <input type="file" id="file_upload_input" onchange="file_upload();">
    3.   <div id="uploaded_images"></div>
    4. </div>



    возвращается скриптом upload.php
    [js]<script type="text/javascript">window.top.onfileupload({"filename":"af6a8dd1202d722ec0f91ae7a93ea16c.tmp", "title":"DSCN8369.JPG", "guid":"1"});</script>[/js]

    upload.php проверяет, что файл является изображением, кладёт в папку /images/uploaded/ с уникальным номером, делает там же превьюшку с тем же именем, но с расширением thumbnail