Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> шкала залива файла 
V
    Опции темы
taral
Дата 7.2.2008, 16:19 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Как осуществить такую штуку.
Пользователь выбирает файл и жмет залить. В бразере появляется шкала. От 0 до 100% которая отображает сколько залилось.
У меня есть такая идея.
Через javascript посылаю динамически запросы на сервер (через java библиотеку). Там PHP определяю размер и отсылаю цифру назад.
Что думаете. Возможно так сделать?
И какие советы для осуществеления.
PM MAIL   Вверх
Silent_s
Дата 7.2.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 142
Регистрация: 2.12.2007
Где: Москва

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



Да тоже об этом думал, а ты знаешь как сделать что бы хотяб просто через форму можно было залить файлы на сервак?
--------------------
Мой блог
PM MAIL   Вверх
taral
Дата 7.2.2008, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Silent_s @  7.2.2008,  16:38 Найти цитируемый пост)
Да тоже об этом думал, а ты знаешь как сделать что бы хотяб просто через форму можно было залить файлы на сервак?

В смысле? С помощью ajax? Да знаю

Ой я ошибся в посте. не java а ajax библиотеку smile 


Это сообщение отредактировал(а) taral - 7.2.2008, 17:07
PM MAIL   Вверх
flashaa
Дата 7.2.2008, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Думаю, невозможно. Протокол HTTP это не флешки и не ICQ. Отличие в том, первые работают при прямом соединение с сервером по протоколу TCP/IP, а браузеры по HTTP. Это протокол высокого(не помню, какой там правильный термин) уровня -  мы не можем следить за передачей байтов, мы можем просто впихнуть информацию в запрос и послать этот запрос. Все. 
Теперь соотвественно если подумать, как можно построить индикатор загрузки - только если делить файл на куски (скажем по 100 кб) и отправлять эти куски отдельными запросами. Мало того, что это геморой, это вообще невозможно из-за политики браузеров (если бы браузеры могли читать пользовательские файлы по требованию скриптов, то представьте, что было бы).
Единственный вариант вижу - использование флешек. Они это осуществить потенциально могут, т.к. могут работают как программы с постоянным соединением по TCP/IP, но наверняка и у флешей есть ограничения в плане безопасности.


Это сообщение отредактировал(а) flashaa - 7.2.2008, 17:17
PM MAIL   Вверх
taral
Дата 7.2.2008, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(flashaa @  7.2.2008,  17:17 Найти цитируемый пост)
Думаю, невозможно.

Ну просто заливать через ajax можно. Я заливал.
Я думал так. Когда файл зачинает заливатся он временно создается в папке сервера.
И чем больше его залило тем больше он места занимает. Я думал так. Начинаю залив, потом просто проверяю динамически его размер.
PM MAIL   Вверх
flashaa
Дата 7.2.2008, 17:31 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, кстати для открытия постоянного соединения по TCP потребуется не хостинг , а сервер.
Есть всякие приемы по удержанию http-соединений (эмуляция постоянного соединения), но мне кажется все это никому не нужно . (в данном случае)

Добавлено через 11 минут и 17 секунд
Цитата(taral @  7.2.2008,  17:31 Найти цитируемый пост)
Ну просто заливать через ajax можно.

то, что просто заливать можно это понятно. Через AJAX. Порции файла вы отмерить не сможете.
А по поводу того, каков размер файла на сервере - так может быть сервер и будет видеть все градации размера файла (хотя сомневаюсь), он вам ответ не даст раньше того, как получит ЦЕЛИКОМ ВАШ ЗАПРОС. Это опять-таки из-за ограничений HTTP.

Это сообщение отредактировал(а) flashaa - 7.2.2008, 17:31
PM MAIL   Вверх
taral
Дата 7.2.2008, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(flashaa @  7.2.2008,  17:31 Найти цитируемый пост)
то, что просто заливать можно это понятно. Через AJAX. Порции файла вы отмерить не сможете.А по поводу того, каков размер файла на сервере - так может быть сервер и будет видеть все градации размера файла (хотя сомневаюсь), он вам ответ не даст раньше того, как получит ЦЕЛИКОМ ВАШ ЗАПРОС. Это опять-таки из-за ограничений HTTP.

Ясно. Вот в этом моменте я и сомневался. Жаль(
Есть варианты как решить?
Может есть готовая флеш форма?
Я в флеше не разбераюсь(
Может какой-то урезанный вариант на ajax
PM MAIL   Вверх
flashaa
Дата 7.2.2008, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По поводу заливки файла через AJAX.
Как я сказал выше, у браузеров есть опреденные ограничения по безопасности - нельзя читать пользовательские файлы ниоткуда, кроме как из поля input type=file. Причем это поле может быть только выбрано пользователем (никаких скриптовых установок и дефолтных значений). А что есть AJAX - это вы с помощью JS собираете запрос, потом передаете его объекту XmlHttpRequest или его аналогу, а тот в свою очередь отправляет этот запрос серверу в фоновом режиме. 
В случае с файлом, вы не можете считать содержимое файла и поместить его в запрос.. Поэтому AJAX в прямом смысле этого слова (через использование XmlHttpRequest) в этом случае бессилен.
А происходит вот что: JS в текущем документе создает элемент IFRAME и там создает аналогичную форму (с полем file, которое указал пользователь), затем отправляет ее (submit). Во фрейм загружается ответ сервера, текущее окно не тронуто -  этим приемом создается ощущение параллельности, присущее AJAX'у, но это не AJAX.
Просто захотелось поумничать )

Taral а что если оставить эту потребность? Даже супер-пупер крутые сайты не утруждают себя реализацией этого. Ведь есть куча других задач.

Это сообщение отредактировал(а) flashaa - 7.2.2008, 18:00
PM MAIL   Вверх
taral
Дата 7.2.2008, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(flashaa @  7.2.2008,  17:56 Найти цитируемый пост)
Taral а что если оставить эту потребность?

А как на рапиде сделано?
Тут не мои прихоти. Просто на сайт часто будут заливатся файлы размером до 30 мб.
Ну и хотелось все красиво сделать.
Ну раз сделать так очень сложно то выбора нету(
PM MAIL   Вверх
gta4kv
Дата 7.2.2008, 20:29 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

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



Цитата(taral @ 7.2.2008,  20:21)
Цитата(flashaa @  7.2.2008,  17:56 Найти цитируемый пост)
Taral а что если оставить эту потребность?

А как на рапиде сделано?
Тут не мои прихоти. Просто на сайт часто будут заливатся файлы размером до 30 мб.
Ну и хотелось все красиво сделать.
Ну раз сделать так очень сложно то выбора нету(

На рапиде на сколько я знаю PL.

А реализовано помойму через iframe oO

Мой пост видимо совсем все таки не в тему)

Это сообщение отредактировал(а) gta4kv - 7.2.2008, 20:31
PM MAIL   Вверх
solenko
Дата 7.2.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

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



flashaa, ну давайте уж и я поумничаю )
Цитата

А происходит вот что: JS в текущем документе создает элемент IFRAME и там создает аналогичную форму 

неа. просто форме указываем как target скрытый фрейм и отправляем текущую форму туда.

taral, вроде как готовое решение вашей идеи с проверкой размера файла.
Цитата

When an enctype="multipart/form-data" is submitted, PHP have to wait the end of upload process.
But what really happen to the server ?
An incremental copy of the file is created while the upload process is waiting for the end, and this file will be the key for this application.
Another php file, during upload, should read the size of this file then should tell us its filesize!.
Sure, that php page that is uploading cannot tell us anything, but another page should!
Then with a JavaScript function and LoadVars object it's really simple call the other page.

Исходники не смотрел, но слабо представляю как это будет работать при загрузке файлов несколькими пользователями. Если получится прикрутить -- отпишитесь о успехе, плиз.
Ну и еще, насколько я знаю, APC позволяет такое сделать

Добавлено через 2 минуты и 17 секунд
Цитата

Может есть готовая флеш форма?

http://www.masrizal.com/index.cfm?fuseacti...php_flashupload


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
flashaa
Дата 7.2.2008, 21:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Solenko, если заработает, то респект. Но как-то ненадежно выглядит.
Цитата(solenko @  7.2.2008,  21:18 Найти цитируемый пост)

неа. просто форме указываем как target скрытый фрейм и отправляем текущую форму туда.

Да, похоже, что так. Реализация этого из библиотеки JsHttpRequest :
Код

// Create invisible IFRAME with temporary form (form is used on empty queryElem).
        // We ALWAYS create th IFRAME in the document of the form - for Opera 7.20.
        var d = form && (form.ownerDocument || form.document) || document;
        var ifname = 'jshr_i_' + th.id;
        var s = th.span = d.createElement('DIV');
        s.style.position = 'absolute';
        s.style.display = 'none';
        s.style.visibility = 'hidden';
        s.innerHTML = 
            (form? '' : '<form' + (th.method == 'POST'? ' enctype="multipart/form-data" method="post"' : '') + '></form>') + // stupid IE, MUST use innerHTML assignment :-(
            '<iframe name="' + ifname + '" id="' + ifname + '" style="width:0px; height:0px; overflow:hidden; border:none"></iframe>'
        if (!form) {
            form = th.span.firstChild;
        }

        // Insert generated form inside the document.
        // Be careful: don't forget to close FORM container in document body!
        d.body.insertBefore(s, d.body.lastChild);

        // Function to safely set the form attributes. Parameter attr is NOT a hash 
        // but an array, because "for ... in" may badly iterate over derived attributes.
        var setAttributes = function(e, attr) {
            var sv = [];
            var form = e;
            // This strange algorythm is needed, because form may  contain element 
            // with name like 'action'. In IE for such attribute will be returned
            // form element node, not form action. Workaround: copy all attributes
            // to new empty form and work with it, then copy them back. This is
            // THE ONLY working algorythm since a lot of bugs in IE5.0 (e.g. 
            // with e.attributes property: causes IE crash).
            if (e.mergeAttributes) {
                var form = d.createElement('form');
                form.mergeAttributes(e, false);
            }
            for (var i = 0; i < attr.length; i++) {
                var k = attr[i][0], v = attr[i][1];
                // TODO: http://forum.dklab.ru/viewtopic.php?p=129059#129059
                sv[sv.length] = [k, form.getAttribute(k)];
                form.setAttribute(k, v);
            }
            if (e.mergeAttributes) {
                e.mergeAttributes(form, false);
            }
            return sv;
        }

        // Run submit with delay - for old Opera: it needs some time to create IFRAME.
        var closure = function() {
            // Save JsHttpRequest object to new IFRAME.
            top.JsHttpRequestGlobal = JsHttpRequest;
            
            // Disable ALL the form elements.
            var savedNames = [];
            if (!wholeFormSending) {
                for (var i = 0, n = form.elements.length; i < n; i++) {
                    savedNames[i] = form.elements[i].name;
                    form.elements[i].name = '';
                }
            }

            // Insert hidden fields to the form.
            var qt = th.queryText.split('&');
            for (var i = qt.length - 1; i >= 0; i--) {
                var pair = qt[i].split('=', 2);
                var e = d.createElement('INPUT');
                e.type = 'hidden';
                e.name = unescape(pair[0]);
                e.value = pair[1] != null? unescape(pair[1]) : '';
                form.appendChild(e);
            }


            // Change names of along user-passed form elements.
            for (var i = 0; i < th.queryElem.length; i++) {
                th.queryElem[i].e.name = th.queryElem[i].name;
            }

            // Temporary modify form attributes, submit form, restore attributes back.
            var sv = setAttributes(
                form, 
                [
                    ['action',   th.url],
                    ['method',   th.method],
                    ['onsubmit', null],
                    ['target',   ifname]
                ]
            );
            form.submit();
            setAttributes(form, sv);

            // Remove generated temporary hidden elements from the top of the form.
            for (var i = 0; i < qt.length; i++) {
                // Use "form.firstChild.parentNode", not "form", or IE5 crashes!
                form.lastChild.parentNode.removeChild(form.lastChild);
            }
            // Enable all disabled elements back.
            if (!wholeFormSending) {
                for (var i = 0, n = form.elements.length; i < n; i++) {
                    form.elements[i].name = savedNames[i];
                }
            }
        }
        JsHttpRequest.setTimeout(closure, 100);

        // Success.
        return null;


Это сообщение отредактировал(а) flashaa - 7.2.2008, 21:51
PM MAIL   Вверх
Smith
Дата 7.2.2008, 21:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



PM MAIL   Вверх
taral
Дата 7.2.2008, 23:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Огромное спасибо всем!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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