Форум программистов, компьютерный форум, киберфорум
Наши страницы
Perl: разработка для Web
Войти
Регистрация
Восстановить пароль
 
webymax
1 / 1 / 0
Регистрация: 14.07.2013
Сообщений: 23
#1

Upload progress в связке Perl + PHP + Javascript - Perl

27.11.2014, 21:31. Просмотров 734. Ответов 7
Метки нет (Все метки)

Я работаю на php. Perl не знаю.
1. Скажите, пожалуйста, какой принцип использует perl для получения данных об общем размере байтов и размере закачанных байтов при загрузке файлов на сервер? В php для этого используются сессии - достаточно добавить в форму специальное hidden-поле и со стартом загрузки появляются глобальные сессионные переменные с нужными данными.
2. По причине особенностей устройства сервера, php-механизм отслеживания загрузки файлов мне не доступен, поэтому я хотел бы привлечь к задаче perl. На php будет скрипт, сохраняющий файл (т.е. форма будет своим action адресоваться к php-скрипту). Создать javascript, обращающийся с заданной периодичностью на сервер к perl-скрипту за нужными данными, не составляет труда - скорее всего сделаю это через невидимый iframe с src="путь-до-скрипта-на-перле?с-нужным-get-запросом". Перл будет вызывать яваскрипт в родительском окне для отдачи промежуточных данных о ходе загрузки. Когда загрузка закончится, яваскрипт перестанет дёргать перл, php спокойно сохранит файл. Можно ли так организовать связку?

Добавлено через 4 часа 26 минут
Да уж... не стоило наверное на форуме про перл начинать тему с фразы "я работаю на php, перла не знаю" ))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2014, 21:31
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Upload progress в связке Perl + PHP + Javascript (Perl):

Perl и JavaScript
Здравствуйте. Есть перловский скрипт, который вытаскивает из БД пути к...

javascript выполнение в perl
В последнее время в качестве защиты от ботов используется javascript шифрование...

обращаюсь к тем,кто знает JavaScript и Perl.
обращаюсь к тем,кто знает JavaScript и Perl. такая проблема...есть у меня две...

Perl to PHP
Perl:...

Perl&PHP
Здравствуйте. Из файла Perl мне нужно выполнить некоторые действия другим...

Передача данных между Perl и PHP
Всем привет! Стоит такая вот задача: Есть файл test.php и test.pl и из...

7
Dmitriy_M
1412 / 1295 / 126
Регистрация: 20.03.2009
Сообщений: 4,617
Записей в блоге: 11
28.11.2014, 00:31 #2
А если почитать документацию по HTTP?
multipart/form-data
0
webymax
1 / 1 / 0
Регистрация: 14.07.2013
Сообщений: 23
28.11.2014, 08:01  [ТС] #3
Понятно, что в форме должен быть выставлен атрибут enctype="multipart/form-data". И ваше сообщение ещё наверное намекает на то, что такой способ отправки формы позволяет получать информацию о частях содержимого. Это наверное было к вопросу №1.
Из ответа на вопрос №1 я планировал уловить - может ли перл действовать параллельно с процессом, передающим пост-данные php-скрипту. Поэтому привёл пример, как это делается в php - передавай данные хоть перлу, хоть эйчтиэмелю, но php будет знать информацию о прогрессе загрузки из любого места, т.к. эта информация хранится в сессии - глобальном (доступном везде) пространстве переменных.
Если перл так не может, то, наверное, action формы нужно адресовать напрямую перлу. Тогда и сохранение файла, видимо, придётся делать на перле. Но я хотел бы этого избежать, и отдать всё таки сохранение php-скрипту. А на перл повесить лишь считывание и передачу яваскрипту данных о прогрессе загрузки.

Добавлено через 2 минуты
Dmitriy_M, в любом случае спасибо за ответ, я очень обрадовался движению по моей теме
0
Dmitriy_M
1412 / 1295 / 126
Регистрация: 20.03.2009
Сообщений: 4,617
Записей в блоге: 11
28.11.2014, 10:42 #4
По HTTP если у запроса есть тело, то нужно выставлять заголовок Content-Length, собственно это и есть ответ на вопрос о размере данных.

Как сервер обрабатывает загрузку файла? Загружает данные во временный файл и отдает скрипту, или пилит запрос на чанки и передает в скрипт чанки?
0
TheAthlete
154 / 154 / 16
Регистрация: 31.08.2010
Сообщений: 538
28.11.2014, 12:06 #5
А зачем такие сложности - можно тогда просто использовать фреймворк Dancer2.
Там есть все необходимое:
  • content_length() позволяет определить размер загруженных данных,
  • upload($name) позволяет загрузить файлы,
  • Dancer2::Plugin::Ajax - позволяет упростить работу с AJAX
  • в документации Documentation Index расписано как все это работает

В дополнение про JS: Загрузка c индикацией прогресса.
0
webymax
1 / 1 / 0
Регистрация: 14.07.2013
Сообщений: 23
28.11.2014, 14:17  [ТС] #6
По HTTP если у запроса есть тело, то нужно выставлять заголовок Content-Length, собственно это и есть ответ на вопрос о размере данных.
Как сервер обрабатывает загрузку файла? Загружает данные во временный файл и отдает скрипту, или пилит запрос на чанки и передает в скрипт чанки?
Т.е. в форме в атрибуте action нужно прописать именно перловый скрипт, чтобы поймать прогресс загрузки? ПХП нельзя?

А зачем такие сложности - можно тогда просто использовать фреймворк Dancer2.
Поймать прогресс при загрузке - маленькая задачка в большом проекте, поэтому ради неё нецелесообразно переходить на фреймворк. Хотелось бы этот момент сделать ручками. Тем более что яваскрипт-часть готова, php-часть готова, осталось дело за малым.

В дополнение про JS: Загрузка c индикацией прогресса.
Там описывается работа через модуль File API, хостер отказывает в установке на сервер дополнительных акселераторов.

Вообще на php серверная часть, если не усложнять, состоит всего из нескольких строчек:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// высываем php-скрипт яваскриптом с определённой периодичностью, передаём ему id загрузки GETом
$id = $_GET['id'];
 
// если на сервере не работает встроенный в PHP (начиная с версии 5.4) модуль "upload_progress" 
// то вызываем javascript, закрывающий ловлю прогресса
if (!ini_get("session.upload_progress.enabled")) {
    echo '
    <script language="JavaScript" type="text/javascript">
        window.parent.cancelLoadProgress('.$id.');
    </script>';
} else {
    $bytes_uploaded = 0;
    $bytes_total    = 0;    
    $key            = ini_get("session.upload_progress.prefix").$id;
    if (isset($_SESSION[$key])) {
        $bytes_uploaded = $_SESSION[$key]['bytes_processed'];
        $bytes_total    = $_SESSION[$key]['content_length'];
    }
    // высчитываем процент загрузки
    $progress = !empty($bytes_uploaded) && !empty($bytes_total) ? floor($bytes_uploaded / $bytes_total * 100) : 0;
    // отдаём полученный процент яваскрипту для отображения на сайте
    echo '
    <script language="JavaScript" type="text/javascript">
        window.parent.showLoadProgress('.$progress.', '.$id.');
    </script>';
}
На перле нельзя также сделать?
0
Dmitriy_M
1412 / 1295 / 126
Регистрация: 20.03.2009
Сообщений: 4,617
Записей в блоге: 11
28.11.2014, 14:49 #7
webymax, если сервер не настроен, то и на перле ничего нельзя будет сделать.

Добавлено через 2 минуты
А так, смотрите PROCESSING A FILE UPLOAD FIELD
0
webymax
1 / 1 / 0
Регистрация: 14.07.2013
Сообщений: 23
28.11.2014, 14:55  [ТС] #8
Сервер просто настроен так, что он запускает PHP через FastCGI. В этом случае upload-progress примочки на php не работают. Но меня терзают надежды, что на перле всё будет пучком.
Спасибо большое за ссылку. По-моему это то, что нужно.
0
28.11.2014, 14:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.11.2014, 14:55
Привет! Вот еще темы с решениями:

Поддерживает ли встроенный сервер PHP скрипты языка Perl?
В PHP существует встроенный сервер. Создаю файл index.html с формой и файл...

Perl Cgi + Javascript "jquery"...
Помогите пожалуйста разобраться в проблеме... Есть CGI скрипт написанный на...

Задачки на понимание Perl (Скользкие места Perl)
Задача на понимание списочных литералов что выведет каждая из строк $num...

Графика в Perl, как создать GIF в Perl.
Помогите создать GIF при помощи перла. И где взять модули?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru