Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Jquery дополнение к плагину ajaxFileUpload 
V
    Опции темы
supercelt
Дата 4.6.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



мне кажется сложная задача. Есть файл create_page.html

Код

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Админцентр</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="expires" content="-1">
<meta name="robots" content="index,nofollow">
<link href="s01_admin_css.css" type="text/css" rel="stylesheet">
<link href="ubr.css" type="text/css" rel="stylesheet">
<script type="text/javascript" src="../cms_s01_libs/jquery/jquery.js"></script>
<script type="text/javascript" src="../cms_s01_libs/jquery/jquery.form.js"></script>
<script type="text/javascript" src="../cms_s01_libs/jquery/ajaxfileupload.js"></script>
<script type="text/javascript" src="../cms_s01_libs/tiny_mce/tiny_mce_gzip.js"></script>
<script type="text/javascript">
unction ajaxFileUpload()
    {
        $("#progress_upload")
        .ajaxStart(function(){
            $(this).show();
        })
        .ajaxComplete(function(){
            $(this).hide();
        });
        
        $("#upload_file_button").ajaxStart(function(){
        $(this).hide();
        }).ajaxComplete(function(){
        $(this).show();
        });

        $.ajaxFileUpload({
                url:'s01_admin_handlers_ajax/upload_file.php',
                secureuri:false,
                fileElementId:'upload_file',
                dataType: 'json',
                success: function (data, status)
                {
                        if(data.error != '')
                        {
                            //alert(data.error);
                            $("#output_upload").empty().show().append(data.error);
                        }
                        else
                        {
                            //alert(data.mess);
                            $("#output_upload").empty().show().append(data.mess);
                        }
                    
                },
                error: function (data, status, e)
                {
                    alert(e);
                }
        })
        
        return false;
    }
</script>
</head>
<body>
<form action="s01_admin_handlers_ajax/create_page.php" method="post" id="mySettings" enctype="multipart/form-data">
<input type="file" name="upload_file" id="upload_file" class="input_admin_100" />
<input type="hidden" name="MAX_FILE_SIZE" value="20000000">
<div id="button_upload"><input type="button" id="upload_file_button" name="upload_file_button" class="admin_button" value="Upload" onclick="return ajaxFileUpload();" />

<select name="upload_dst_dir" id="upload_dst_dir" class="input_admin">
<option value="0" selected="selected">---</option>
<option value="upload_audio">upload_audio</option>
<option value="upload_files">upload_files</option>
<option value="upload_images">upload_images</option>
<option value="upload_video">upload_video</option>
</select></form>
</html>


Содержание файла ajaxfileupload.js

Код


jQuery.extend({
    

    createUploadIframe: function(id, uri)
    {
            //create frame
            var frameId = 'jUploadFrame' + id;
            
            if(window.ActiveXObject) {
                var io = document.createElement('<iframe id="' + frameId + '" name="' + frameId + '" />');
                if(typeof uri== 'boolean'){
                    io.src = 'javascript:false';
                }
                else if(typeof uri== 'string'){
                    io.src = uri;
                }
            }
            else {
                var io = document.createElement('iframe');
                io.id = frameId;
                io.name = frameId;
            }
            io.style.position = 'absolute';
            io.style.top = '-1000px';
            io.style.left = '-1000px';

            document.body.appendChild(io);

            return io            
    },
    createUploadForm: function(id, fileElementId)
    {
        //create form    
        var formId = 'jUploadForm' + id;
        var fileId = 'jUploadFile' + id;
        var form = $('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');    
        var oldElement = $('#' + fileElementId);
        var newElement = $(oldElement).clone();
        $(oldElement).attr('id', fileId);
        $(oldElement).before(newElement);
        $(oldElement).appendTo(form);
        //set attributes
        $(form).css('position', 'absolute');
        $(form).css('top', '-1200px');
        $(form).css('left', '-1200px');
        $(form).appendTo('body');        
        return form;
    },

    ajaxFileUpload: function(s) {
        // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout        
        s = jQuery.extend({}, jQuery.ajaxSettings, s);
        var id = new Date().getTime()        
        var form = jQuery.createUploadForm(id, s.fileElementId);
        var io = jQuery.createUploadIframe(id, s.secureuri);
        var frameId = 'jUploadFrame' + id;
        var formId = 'jUploadForm' + id;        
        // Watch for a new set of requests
        if ( s.global && ! jQuery.active++ )
        {
            jQuery.event.trigger( "ajaxStart" );
        }            
        var requestDone = false;
        // Create the request object
        var xml = {}   
        if ( s.global )
            jQuery.event.trigger("ajaxSend", [xml, s]);
        // Wait for a response to come back
        var uploadCallback = function(isTimeout)
        {            
            var io = document.getElementById(frameId);
            try 
            {                
                if(io.contentWindow)
                {
                     xml.responseText = io.contentWindow.document.body?io.contentWindow.document.body.innerHTML:null;
                  xml.responseXML = io.contentWindow.document.XMLDocument?io.contentWindow.document.XMLDocument:io.contentWindow.document;
                     
                }else if(io.contentDocument)
                {
                     xml.responseText = io.contentDocument.document.body?io.contentDocument.document.body.innerHTML:null;
                 xml.responseXML = io.contentDocument.document.XMLDocument?io.contentDocument.document.XMLDocument:io.contentDocument.document;
                }                        
            }catch(e)
            {
                jQuery.handleError(s, xml, null, e);
            }
            if ( xml || isTimeout == "timeout") 
            {                
                requestDone = true;
                var status;
                try {
                    status = isTimeout != "timeout" ? "success" : "error";
                    // Make sure that the request was successful or notmodified
                    if ( status != "error" )
                    {
                        // process the data (runs the xml through httpData regardless of callback)
                        var data = jQuery.uploadHttpData( xml, s.dataType );    
                        // If a local callback was specified, fire it and pass it the data
                        if ( s.success )
                            s.success( data, status );
    
                        // Fire the global callback
                        if( s.global )
                            jQuery.event.trigger( "ajaxSuccess", [xml, s] );
                    } else
                        jQuery.handleError(s, xml, status);
                } catch(e) 
                {
                    status = "error";
                    jQuery.handleError(s, xml, status, e);
                }

                // The request was completed
                if( s.global )
                    jQuery.event.trigger( "ajaxComplete", [xml, s] );

                // Handle the global AJAX counter
                if ( s.global && ! --jQuery.active )
                    jQuery.event.trigger( "ajaxStop" );

                // Process result
                if ( s.complete )
                    s.complete(xml, status);

                jQuery(io).unbind()

                setTimeout(function()
                                    {    try 
                                        {
                                            $(io).remove();
                                            $(form).remove();    
                                            
                                        } catch(e) 
                                        {
                                            jQuery.handleError(s, xml, null, e);
                                        }                                    

                                    }, 100)

                xml = null

            }
        }
        // Timeout checker
        if ( s.timeout > 0 ) 
        {
            setTimeout(function(){
                // Check to see if the request is still happening
                if( !requestDone ) uploadCallback( "timeout" );
            }, s.timeout);
        }
        try 
        {
           // var io = $('#' + frameId);
            var form = $('#' + formId);
            $(form).attr('action', s.url);
            $(form).attr('method', 'POST');
            $(form).attr('target', frameId);
            if(form.encoding)
            {
                form.encoding = 'multipart/form-data';                
            }
            else
            {                
                form.enctype = 'multipart/form-data';
            }            
            $(form).submit();

        } catch(e) 
        {            
            jQuery.handleError(s, xml, null, e);
        }
        if(window.attachEvent){
            document.getElementById(frameId).attachEvent('onload', uploadCallback);
        }
        else{
            document.getElementById(frameId).addEventListener('load', uploadCallback, false);
        }        
        return {abort: function () {}};    

    },

    uploadHttpData: function( r, type ) {
        var data = !type;
        data = type == "xml" || data ? r.responseXML : r.responseText;
        // If the type is "script", eval it in global context
        if ( type == "script" )
            jQuery.globalEval( data );
        // Get the JavaScript object, if JSON is used.
        if ( type == "json" )
            eval( "data = " + data );
        // evaluate scripts within html
        if ( type == "html" )
            jQuery("<div>").html(data).evalScripts();
            //alert($('param', data).each(function(){alert($(this).attr('value'));}));
        return data;
    }
})


Ну понятно, что вот тут задаются параметры:

url:'s01_admin_handlers_ajax/upload_file.php',
secureuri:false,
fileElementId:'upload_file',
dataType: 'json',

Так вот эта штука работает, хорошо работает, но, она сделана так, что передаёт только файл и всё. А по html файлу видно, что там есть селект, где выбирается название папки куда загружать этот рисунок. И он соотв. уже идёт в перемиенной POST, если в php его ловить. Помогите пожалуйста дописать этот плагин, что бы можно было вместе с полем file передать ещё хотя бы одно поле type="text" и что бы оно пришло в php файл.
PM   Вверх
Aliance
Дата 5.6.2009, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


Профиль
Группа: Модератор
Сообщений: 6418
Регистрация: 2.8.2004
Где: spb

Репутация: 7
Всего: 137



Код

url:'s01_admin_handlers_ajax/upload_file.php?dst=' + $( '#upload_dst_dir' ).val(),


upload_file.php:
Код

$_GET['dst'];

PM MAIL WWW ICQ Skype   Вверх
supercelt
Дата 5.6.2009, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



Aliance, не работает(. Эта переменная до туда просто не доходит. В upload_file.php делаю 
Код

if(isset($_GET['upload_dst_dir']))
     $get = 'yes';
     else
     $get = 'no';


Потом эхо, и выводит что нет такой
PM   Вверх
supercelt
Дата 5.6.2009, 20:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



Проблему решил, смотрите как, может кому пригодиться:

В форме делается это поле или селект

Код

<input type="text" name="upload_dst_dir" id="dst_dir_id" />


вот в этом фрагменте:

Код

$.ajaxFileUpload({
                url: 's01_admin_handlers_ajax/upload_file.php',
                secureuri: false,
                fileElementId: 'upload_file',
                f_dir: 'dst_dir_id',
                dataType: 'json',
                success: function (data, status)

Дописывается f_dir: 'dst_dir_id',

В файле ajaxfileupload.js, в этом блоке делаем так:
Код

createUploadForm: function(id, fileElementId, f_dir)
    {
        //create form    
        var formId = 'jUploadForm' + id;
        var fileId = 'jUploadFile' + id;
        var form = $('<form  action="" method="POST" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"></form>');    
        var oldElement = $('#' + fileElementId);
        var newElement = $(oldElement).clone();
        $(oldElement).attr('id', fileId);
        $(oldElement).before(newElement);
        $(oldElement).appendTo(form);
        //--------------
        var old_f = $('#' + f_dir);
        var new_f = $(old_f).clone();
        $(old_f).attr('name', 'upload_dst_dir');
        $(old_f).before(new_f);
        $(old_f).appendTo(form);
        //--------------
        //set attributes
        $(form).css('position', 'absolute');
        $(form).css('top', '-1200px');
        $(form).css('left', '-1200px');
        $(form).appendTo('body');        
        return form;
    },


И в пхп файле ловим вот так: $upload_dir = $_POST['upload_dst_dir'];
PM   Вверх
AlexanderI
Дата 28.4.2010, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 230
Регистрация: 9.7.2004

Репутация: нет
Всего: 3



supercelt, привет, понадобилось сделать тоже самое. 
Ты точно ничего больше не забыл ?
У меня так не работат.

Перепроверь пожалуйста, очень надо.
--------------------
Магазин детских игрушек  | Авто ВАЗ
PM MAIL   Вверх
IDVsbruck
Дата 28.4.2010, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 778
Регистрация: 12.11.2006

Репутация: 4
Всего: 22



Только сегодня выложил код (совпадение ли?): http://forum.vingrad.ru/forum/topic-298928.html
PM MAIL   Вверх
fizikfizik
Дата 23.2.2011, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 23.2.2011

Репутация: нет
Всего: нет



Он забыл указать еще вот здесь: в разделе ajaxFileUpload: 
Код

ajaxFileUpload: function(s) {
        // TODO introduce global settings, allowing the client to modify them for all requests, not only timeout        
        s = jQuery.extend({}, jQuery.ajaxSettings, s);
        var id = new Date().getTime()        
        var form = jQuery.createUploadForm(id, s.fileElementId, s.f_dir);

PM MAIL   Вверх
numerovan
Дата 9.10.2012, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 549
Регистрация: 1.12.2007

Репутация: нет
Всего: 2



Продолжаю тему, задача немного усложнённая ...
Код

$.ajaxFileUpload( {url:'backend.php?get_var=value', 
                           secureuri:false, 
                           fileElementId:id,
                           dataType: 'json'});


С GET-ом разобрались и с FILE-ом тоже разобрались.

Как с помощью вышеуказанного кода отправить POST-данные ? самособой разумееться туда же входит и GET и FILE

Сама тег form не использую, яваскриптом подхвачиваю значения полей и передаю в ф-ию ajaxFileUpload(), там же хочу чтоб размещались как и GET, POST и FILE ...

Для чего вообще мне нужен этот POST ... есть тег textarea в него впишут допустим целую страницу текста, и вот этот текст самособой в GET не влезит, поэтому хочу именно большую текстовую часть передать POST-ом, а всё остальное работает так как надо.

Спустя какое-то время пришёл к выводу что нужно к функции прикрепить ещё один дополнительный параметр, так же как и файл ... большой текст полностью передаёться ... вопрос теперь в том - а можно ли так !?  ... встречаю коды, там вроде делают ... начинаю делать я, не получаеться ...

Это сообщение отредактировал(а) numerovan - 9.10.2012, 09:45
PM MAIL   Вверх
numerovan
Дата 9.10.2012, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 549
Регистрация: 1.12.2007

Репутация: нет
Всего: 2



Так решил эту задачу. Оставлю решение на тот случай если кому нибудь это пригодиться.

Функцию $.ajaxFileUpload(), нужно подправить следующим образом:
Код

$.ajaxFileUpload( {url:window.host + '/backend.php', 
                           data: { upload_title:        upload_title, 
                                   upload_cost:        upload_cost,
                                   upload_text:        upload_text,
                                   upload_path:        upload_path,
                                   upload_add_folder:    addFolder, 
                                   upload_discount:    upload_discount, 
                                   upload_dop_tovar:    upload_dop_tovar},
                           secureuri:false, 
                           fileElementId:id,
                           dataType: 'json'});

function replace_string(txt, cut_str, paste_str){ 
    var f=0;
    var ht='';
    ht = ht + txt;
    f=ht.indexOf(cut_str);

    while (f!=-1){ 
        //цикл для вырезания всех имеющихся подстрок 
        f=ht.indexOf(cut_str);
        
        if (f>0){
            ht = ht.substr(0,f) + paste_str + ht.substr(f+cut_str.length);
        };
    };
    return ht
};

все свои ранее GET-запросы поместил в блок data. Назвать нужно именно data. Встречал решения с token, такое не проканало. Блок data попробывал поставить и после url, и после dataType ... всё хорошо работает.
 
В upload_text запихнул большое колличество текста и всё полностью передаёться на сервер, но тут была проблема с двойными 
 ковычками, обрезался текст до появления первой двойной ковычки (это так у меня, может у кого-то будет аллергия и на одинарные ковычки), пришлось их заменять с помощью ф-ии replace_string() (описание выше). Заменил двойные ковычки на &quot;. В общем всё получилось хорошо.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Применение библиотек | Следующая тема »


 




[ Время генерации скрипта: 0.1049 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.