Пожалуйста, ткните носом, куда копать.Имеется: написанный скрипт на awk, которому на вход подается определенный текстовый файл, а на выходе он видоизменяется. То есть запускается в shell
Хочется: автоматизировать это все средством CGI. Загружать файл по http и получить уже обработанный файл в экране браузера
Я написал CGI-скрипт (на bash), могу загрузить файл на сервер, но как его "словить"?
Если в action указать php-скрипт (printf "<form enctype=\"multipart/form-data\" method=POST action=/upload.php), то вроде бы все нормально, можно узнать имя файла из массива $_FILES:команда echo $_FILES["uploadfile"]["name"]; возвращает имя.
Проблема в том, что во-первых, я не знаю ни php, ни perl, во вторых, в конечном итоге я должен передать файл awk-скрипту.Поэтому в качестве action я указываю другой cgi-скрипт (на bash)
printf "<form enctype=\"multipart/form-data\" method=POST action=upload.shЯ пытаюсь получить данный массив с именем файла, вызывая php - строку из своего upload.sh
php -c /etc/httpd -r 'print_r($_SERVER);'Но массив пустой!
В тоже время массив $_SERVER прекрасно передается
php -c /etc/httpd -r 'print_r($_SERVER);'Как лучше поступить?
Или php скриптом "вылавливать" файл и копировать его в определенный каталог, а потом из php-скрипта делать переадресацию на свой CGI-скрипт или же можно обойтись без промежуточого php-скрипта и сразу передавать управление CGI-приложению.В последнем случае я не знаю, как переадать имя загруженного файла. Поэтому прошу помощи.
Заранее спасибо!
Начни с ответа на простой вопрос: зачем тебе вообще имя файла, если ты его хочешь просто обработать и выдать назад в браузер? Тело файла передается в stdin подобно атачам в письмах.
Потом перейди к более сложному вопросу: зачем для веб специфики использовать bash вместо php или perl? Какая религия запрещает вызвать awk скрипт из этих языков через те же обратные кавычки?
Без нормального ответа на эти вопросы помогать с явным извратом желанием не горю.
Заливаешь файл на сервер. В php скрипте (выполняемом сервером) вылавливешь из массива FILES имя временного файла, под которым он залился на сервер и под которым он там уже лежит, натравливаешь всё что нужно на этот файл, выполняя хоть awk с параметром, хоть что ещё.Как запускать здесь. exec, system, обратные кавычки...
http://uk2.php.net/manual/ru/book.exec.php
В настройках php может быть запрещено выполнение команд
Про FILES здесь
http://uk2.php.net/manual/ru/reserved.variables.files.php
Заливка может быть запрещена>> Я пытаюсь получить данный массив с именем файла, вызывая php - строку из своего upload.sh
Или я не понял что-то...
Заливает Apache потом передаёт своему модулю (mod_php) всю инфу. Ну или формирует переменные окружения для скрипта. Как, запустив не сервером, php скрипт, получить в него данные конкретного процесса Apache я, лично, не знаю.
Всем спасибо!Сделал так:
файл заливаю, передаю php-скрипту, в котором вылавливаю имя файла (из $_FILES) и копирую в определенный каталог с определенным именем,
после делаю редирект на CGI скрипт (чистый awk) и получаю обработанный файл.
Извращенно, потому что я знаю только bash, sed и awk.
Cовсем не знаю php, perl. Так же не знаю, как по HTTP передать stdin и получить это в CGI.
Мне проще было ознакомиться с минимальными основами php и наваять простейший промежуточный php-скрипт.
<?php
##print_r($_SERVER);
copy($_FILES["uploadfile"]["tmp_name"],
"/var/tmp/upload.txt"))
header('Location:http://10.0.2.1/cgi-bin/newfile');
exit();
?>
Знания awk вполне могло хватить, для принятия аплоада. Все данные при методе POST передаются через STDIN, в том числе имя, тип и содержимое загружаемого файла.Другое дело, что взять php для этого куда проще чем прочитать о принципах работы CGI и POST, о чем я и говорил.
>Знания awk вполне могло хватить, для принятия аплоада. Все данные при методе
>POST передаются через STDIN, в том числе имя, тип и содержимое
>загружаемого файла.
>
>Другое дело, что взять php для этого куда проще чем прочитать о
>принципах работы CGI и POST, о чем я и говорил.Да, вы правы. Все оказалось так просто!
Даже php уже не нужно.
Спасибо!
Я так понял, Вы решили проблему. У меня не получилось, помогите, плз.
Делаю так. Есть форма:
<form enctype="multipart/form-data" action="zz.sh" method="post">
<input name="userfile" type="file">
<input type="submit" value="Send File">
</form>скрипт zz.sh:
#!/bin/sh
cat >zzz
...Когда происходит submit формы, на сервере появляется нужный файл zzz, но на клиенте браузер висит, пока руками не остановишь. Т. е. дальше команды cat скрипт не уходит. Ощущение, что для cat не приходит признак конца ввода.
Подскажите, как это правильно реализовать.
>Заливает Apache потом передаёт своему модулю (mod_php) всю инфу.С этого момента поподробней, очень интересно про апач заливающий файлы :)
>Ну или формирует переменные окружения для скрипта.Так он заливает(кстати куда) или передает "инфу" или формирует переменные окружения? Не упускайте подробностей.
>Как, запустив не сервером, php скрипт, получить
>в него данные конкретного процесса Apache я, лично, не знаю.Ну то что вы совершенно не представляете принципов работы cgi это ясно, для пыхера даже неудивительно, но все таки было бы неплохо узнать, как рисует этот процесс ваше воображение.
>С этого момента поподробней, очень интересно про апач заливающий файлы :)Ну чего вы так возбудились то ? Понятно, ведь, что я имел ввиду.
Откуда мне знать что вы имели в виду, я не телепат. Вы сказали, что заливает файл сам апач, это неверно и вводит в заблуждение новичков.