Холить тело – нелегкое мужское дело. Холить тело – нелегкое мужское дело Незапятнанный post cgi

После того, как вы установили CGI, имеются несколько способов выполнить его. Если ваш CGI -программа, работающая только с выводом, типа программы Hello,World!, тогда Вы может выполнять ее, просто обращаясь к ее URL.
Большинство программ выполняется как серверное приложение к форме HTML. Прежде, чем научиться, как получать информацию от этих форм, сначала прочтите краткое введение о создании таких форм.

Два наиболее важных тега в форме HTML - это теги

и . Можно создавать большинство форм HTML, используя только эти два тега. В данной главе, Вы изучите эти теги и небольшое подмножество возможных типов или атрибутов . Полное руководство и ссылка на формы HTML находятся в Главе 3 " HTML и формы" .

Тег используется для определения того, какая часть файла HTML должна быть использована для информации, введенной пользователем. Здесь имеется в виду, как большинство страниц HTML вызывает программу CGI. Атрибуты тега определяют имя программы и местоположение - либо локально, либо как полный URL, тип используемого кодирования, и метод перемещения данных, используемых программой.
Следующая строка показывает спецификации для тега :
< ACTION FORM = "url " METHOD = ENCTYPE = "..." >
Атрибут ENCTYPE не играет особой роли и обычно не включается с тегом . Подробная информация относительно тега ENCTYPE дана в Главе 3. Один из способов использования ENCTYPE, показан в Главе 14 "Фирменные расширения. "
Атрибут ACTION ссылается на URL программы CGI. После того, как пользователь заполнит форму и предоставит информацию, вся информация кодируется и передается программе CGI. Программа CGI решает сама вопрос о декодировании и обработке информации; этот аспект рассматривается в "Принятие ввода от браузера, " ниже в настоящей главе.
Наконец, атрибут METHOD описывает, как программа CGI должна получать ввод. Эти два методы - GET и POST - отличаются в отношении того, как передавать информацию программе CGI. Оба обсуждены в "Принятие ввода от браузера. "
Чтобы браузер смог позволить введение информации пользователем, все теги форм и информация должны быть окружены тегом . Не забудьте заключительный тег

для обозначения конца формы. Нельзя иметь форму внутри формы, хотя Вы можете установить форму, которая позволяет представлять части информации в различные местах; этот аспект широко рассматривается в Главе 3.

Вы можете создавать полоски ввода текста, кнопки "radio", окна флажков, и другие средства принятия ввода, используя тег. В данном разделе рассматриваются только поля текстового ввода. Для реализации этого поля, используйте тег со следующими атрибутами:
< INPUT TYPE=text NAME = "... " VALUE = "... " SIZE = MAXLENGTH = >
NAME - символическое имя переменной, которая содержит значение, введенное пользователем. Если Вы включаете текст в атрибут VALUE, этот текст будет помещен как заданный по умолчанию в поле текстового ввода. Атрибут SIZE позволяет Вам определить горизонтальную длину поля ввода, поскольку он будет появляться в окне браузера. И наконец, MAXLENGTH определяет максимальное число символов которые, пользователь может ввести в поле. Обратите внимание, что атрибуты VALUE, SIZE, MAXLENGTH являются необязательными.

Если Вы имеете только одно текстовое поле в пределах формы, пользователь может представить форму, просто набирая информацию на клавиатуре и нажимая Enter. В противном случае, должен быть какой-то другой способ представления информации пользователем. Пользователь представляет информацию, используя кнопку для представления со следующим тегом:
< Input type=submit >
Этот тег создает внутри вашей формы кнопку Submit. Когда пользователь закончивает заполнение формы, он или она может отправить ее содержание по адресу URL, указанному атрибутом ACTION формы, кликая кнопку Submit.

Полезно знать, какие переменные среды являются доступными для программы CGI, как в процессе обучения, так и для отладки. В таблице 2.2 приведены некоторые из доступных переменных среды CGI. Можно также записать программу CGI, которая выводит переменные среды и их значения на браузер Веб.

Таблица 2.2. Некоторые важные переменные среды CGI

Переменная среды Цель
REMOTE_ADDR Адрес IP машины клиента.
REMOTE_HOST Хост хозяина машины клиента.
HTTP _ACCEPT Перечисляет типы MIME данных, которые браузер умеет интерпретировать.
HTTP _USER_AGENT Информация браузера (тип браузера, номер версии, операционная система, и т.д.).
REQUEST_METHOD GET или POST.
CONTENT_LENGTH Размер ввода, если он послан через POST. Если не имеется никакого ввода или если используется метод GET, этот параметр не определен.
QUERY_STRING Содержит вводимую информацию, когда она передается с помощью метода GET.
PATH_INFO Позволяет пользователю определить путь от командной строки CGI (например, http://hostname/cgi-bin/programname/path).
PATH_TRANSLATED Транслирует относительный путь в PATH_INFO в фактический путь в системе.

Чтобы записать приложение CGI, которое отображает переменные среды, нужно знать, как выполнить две вещи:
* Определить все переменные среды и их соответствующие значения.
* Вывести результаты для браузера.

Вы уже знаете, как выполнять последнюю операцию. В Perl переменные среды сохраняются в ассоциативном массиве %ENV, который вводится именем переменной среды. Листинг 2.3 содержит env.cgi, программу Perl, которая служит для достижения нашей цели.

Листинг 2.3. Программа Perl, env.cgi, которая выводит все переменные среды CGI.

#!/usr/local/bin/perl

Print "Content-type: text/html\n\n";

Print " \n";
print "CGI Environment\n";
print "\n";
print "

\n";
print "

CGI Environment

\n";

Foreach $env_var (keys %ENV) {
print "$env_var = $ENV{$env_var}
\n";
}

Print " \n";

Подобная программа может быть написана в C; полный код находится в Листинге 2.4.

Листинг 2.4. Env.cgi.c в C.

/* env.cgi.c */

#include

Extern char **environ;

Int main()
{
char **p = environ;


printf(" \n");
printf("CGI Environment\n");
printf("\n");
printf("

\n");
printf("

CGI Environment

\n");

While(*p != NULL)
printf("%s
\n",*p++);

Printf(" \n");
}


Какая разница между методами GET и POST? GET передает закодированную входную строку через переменную среды QUERY_STRING, а POST передает ее через stdin. POST - более предпочтительный метод, особенно для форм с большим количеством данных, потому-что здесь нет каких-либо ограничений в отношении объема посылаемой информации, а при методе GET объем пространства среды ограничен. GET имеет однако определенное полезное свойство; это подробно рассматривается в Главе 5 "Ввод".
Чтобы определить, который метод используется, программа CGI проверяет переменную среду REQUEST_METHOD, которая будет установлена либо в GET, либо в POST. Если она установлена в POST, длина закодированной информации сохранена в переменной среды CONTENT_LENGTH.


Когда пользователь передает форму, браузер сначала кодирует информацию перед посылкой ее на сервер, а затем на приложение CGI. Когда Вы используете тег , каждому полю присваивают символическое имя. Значение, введенное пользователем, представляется как значение переменной.

Чтобы определить это, браузер использует кодирующую спецификацию URL, которая может быть описана следующим образом:
* Отделяет различные поля амперсандом (&).
* Отделяет имя и значения знаками равенства (=), с именем слева и значением справа.
* Заменяет пробелы знаками "плюс" (+).
* Заменяет все "ненормальные" символы знаком процента (%), за которым следует двузначный шестнадцатеричный код символа.

Ваша конечная закодированная строка будет похожа на следующую:
name1=value1&name2=value2&name3=value3 ...

Например, предположим, что у вас была форма, которая запросила имя и возраст. Код HTML, который использовался для отображения этой формы, представлен в листинге 2.5.

Листинг 2.5. Код HTML для отображения формы имени и возраста.


Name and Age



Enter your name:


Enter your age:




Предположим, что пользователь вводит Joe Schmoe в поле имени, и 20 - в поле возраста. Ввод будет закодирован во входной строке.
name=Joe+Schmoe&age=20

Синтаксический анализ ввода

Для того чтобы эта информация была полезной, нужно использовать информацию на что-то такое, что может быть использовано вашими программами CGI. Стратегии синтаксического анализа ввода рассматриваются в Главе 5. Практически, Вам никогда не придется думать о том, как анализировать ввод, потому что несколько специалистов уже написали доступные для всех библиотеки, которые производят синтаксический анализ. Две такие библиотеки представлены в настоящей главе в следующих разделах: cgi -lib.pl для Perl (написаны Стивом Бреннером) и cgihtml для C (написаны мной).
Общая цель большинства библиотек, написанных на различных языках, состоит в том, чтобы анализировать закодированную строку и помещать пары имен и значений в структуру данных. Имеется очевидное преимущество в использовании языка, который имеет встроенные структуры данных типа Perl; однако, большинство библиотек для языков низшего уровня типа C и C++ включает выполнение структуры данных и подпрограммы.
Не обязательно добиваться полного понимания библиотек; гораздо важнее научиться использовать их как инструментальные средства, чтобы упростить работу программиста CGI.

Cgi -lib.pl


Cgi -lib.pl использует ассоциативные массивы Perl. Функция &ReadParse анализирует входную строку и вводит каждую пару "имя / значение" по имени. Например, соответствующими строками Perl, необходимыми для декодирования только что представленной вводной строки "имя / возраст", были бы
&ReadParse(*input);
Теперь, чтобы увидеть значение, введенное для "имени", можно обращаться к ассоциативному массиву $input {"имя"}. Точно так же, чтобы обратиться к значению "возраста", нужно посмотреть на переменную $input {"возраст"}.

Cgihtml

C не имеет никаких встроенных структур данных, так что cgihtml осуществляет свой собственный список связей для использования со своими анализирующими подпрограммами CGI. Это определяет структуру entrytype следующим образом:
Typedef struct {
Char *name;
Char *value;
} Entrytype;

Чтобы проанализировать вводную строку "name / age" ("имя / возраст") в C, используя cgihtml, используется следующее:

Llist input; /* объявить связанный список, называемый вводом */
read_cgi_input(&input); /* анализировть ввод и место в связанном списке */
Чтобы обратиться к информации о возрасте, можно либо проанализировать список вручную, либо использовать имеющуюся функцию cgi _val ().
#include
#include
Char *age = malloc (sizeof (char) * strlen (cgi _val (input, "age")) + 1);
Strcpy (age, cgi _val (input, "age"));
Значение "возраста" теперь сохранено в строке age.

В Главе 5 глубже рассматриваются эти и другие библиотеки. На данный момент, Вы готовы применить свои знания о вводе и выводе для того, чтобы записать полноценную, и в то же время простую, программу CGI.

Вы собираетесь записать программу CGI, называемую nameage.cgi, которая обрабатывает форму "имя / возраст". Обработка данных (что я обычно называю "промежуточным материалом") минимальна. Nameage.cgi просто декодирует ввод и отображает имя пользователя и возраст. Хотя не особенно много пользы от такого инструмента, он демонстрирует наиболее критический аспект программирования CGI: ввод и вывод.
Вы используете ту же самую форму, как описано выше, вызывая поля "имя и возраст". Пока не стоит беспокоиться об ошибкоустойчивости и эффективности; решите имеющуюся задачу простейшим образом. Решения в Perl и C показаны соответственно в листингах 2.6 и 2.7.


Листинг 2.6. Nameage.cgi в Perl


#!/usr/local/bin/perl
# nameage.cgi
require "cgi-lib.pl"

&ReadParse(*input);
print "Content-Type: text/html\r\n\r\n";
print " \n";
print "Name and Age\n";
print "\n";
print "

\n";
print "Hello, " . $input{"name"} . ". You are\n";
print $input{"age"} . " years old.

\n";
print " \n";

Листинг 2.7. nameage.cgi в C

/* nameage.cgi.c */

#include
#include "cgi-lib.h"

Int main()
{
llist input;

Read_cgi_input(&input);
printf("Content-Type: text/html\r\n\r\n");
printf(" \n");
printf("Name and Age\n");
printf("\n");
printf("

\n");
printf("Hello, %s. You are\n",cgi_val(input,"name"));
printf("%s years old.

\n",cgi_val(input,"age"));
printf(" \n");
}

Обратите внимание на то, что эти две программы почти эквивалентны. Они обе содержат подпрограммы синтаксического анализа, которые занимают только одну строку и обрабатывают весь ввод (благодаря соответствующим библиотечным подпрограммам). Вывод, по существу, является измененной версией вашей основной программы Hello, World!.
Попытайтесь выполнить программу, заполняя форму и нажимая кнопку Submit.


В настоящей главе вкратце были описаны основы программирования CGI. Вы создаете вывод, правильно форматируя ваши данные и печатая в stdout. Получение ввода CGI является несколько более сложным делом, потому что он должен быть проанализирован до своего использования. К счастью, уже существуют несколько библиотек, которые осуществляют синтаксический анализ.
К данному моменту Вы должны достаточно легко справиться с программированием приложений CGI. Оставшаяся часть настоящей книги посвящена более подробному изложению спецификации, подсказкам и стратегии программирования более продвинутых и сложных приложений.

Маникюр. «Быть можно дельным человеком и думать о красе ногтей»

Мужской маникюр не требует обязательного оригинального художественного дизайна, однако любит постоянство. Всем не помешало бы делать скромный гигиенический маникюр и деликатное men-покрытие. Традиционный мужской маникюр включает комплексный уход за руками, бережное подпиливание ногтей, удаление заусенцев, обработку кутикулы и ногтевых валиков, смягчение кожи рук и массаж. По желанию клиента можно завершить сеанс нанесением лечебного покрытия Nail Tek.

Опытный мастер порекомендует клиенту отдать предпочтение европейскому мужскому маникюру, который не требует жертв: чтобы не обрезать кутикулу, а аккуратно ее отодвинуть. Иногда стоит комбинировать различные виды маникюра, например, аппаратный плюс классический.

Тем, у кого сухая кожа, специалисты советуют делать горячий маникюр с использованием натуральных масел и целебных трав. Процедура улучшает «качество» кожи, увлажняет и повышает ее эластичность, делает нежнее. Руки погружаются в подогретое до 50 градусов масло (ванночку с электроподогревом). После процедуры улучшается состояние ногтей, а кожа станет гладкой-гладкой.

Еще к услугам мужчин парафинотерапия, укрепление ногтей био-гелем, покрытие ногтей декоративным лаком и средством Shellac.

Продолжительность процедуры – от 25 минут.

Средняя цена: 1000 рублей.

Антон (www.biokrasota.ru): Я менеджер в довольно крупной компании и регулярно делаю маникюр – если неухоженным ходить, то просто выгонят с работы. Делаю только европейский маникюр, другие виды намного меньше нравятся, хотя аппаратный еще не пробовал.

Карл (blog.fontanka.ru): В мире огромное количество мужественных мужчин, регулярно делающих себе маникюр. Мне, например, маникюр не мешает регулярно заниматься боксом, а моему дяде маникюр не мешал всю жизнь служить на флоте.

Эпиляция. Гладкая кожа не роскошь

Мужчин тоже беспокоят лишние волосы на теле! Проблему можно решать по-разному: один предпочитает бритье, другой терпит выщипывание, третий отправляется на восковую эпиляцию. Лидером по эффективности, комфорту и радикальности удаления волос стала лазерная эпиляция. Энергия лазера разогревает волос и ключевую зону его роста и вызывает их повреждение, разрушая корень и волосяной фолликул. Для стойкого эффекта необходимо выполнить 5–7 процедур с интервалом в несколько недель. Но прежде чем прибегнуть к столь радикальной процедуре, лучше побывать на консультации у специалиста.

Что подставляют под лазер: волосы на лице, щеках, подбородке, области меж бровей, подмышки, живот, кисти рук, бедра, спину, плечи и предплечья, грудь, ягодицы, локальные участки и даже… бикини!

Средняя цена: 3000 рублей.

Гость (hairlife.ru): Я депиляцию делал у разных мастеров, последние четыре месяца делаю электро… делаю для себя, мне не комфортно потеть и чувствовать посторонние запахи… при чем тут секс-меньшинства?

Анна Белова (hairlife.ru): Делала мужу эпиляцию воском – честно, чуть не умер. Весь покраснел, покрылся пятнами, дал удалить только одну подмышку. Сказал: все, больше не хочу.

Ника (hairlife.ru): Я тоже мужу восковую эпиляцию делала, но он сам меня попросил. Думала, что бешеная реакция будет, но стойко выдержал удаление волос на груди.

Гостья (hairlife.ru): Я постоянно мужу удаляю волосы в районе подмышек. В летнее время он просит удалить и на ягодицах (чтобы не так жарко было). А вот… он не выдержал.

Нариса Галева (hairlife.ru): Надо делать четко, быстро и прикладывать руку. Успокаивать и отвлекать разговорами, шутками.

Миостимуляторы. Ленивый фитнес: подкачкой мышц спасай фигуру

Миостимуляторы помогают наращивать мышцы и поддерживать тело в тонусе. Существует их как минимум 20 видов. Устройства-«бабочки» с использованием электрических импульсов заданной силы, стоят недорого. Импульсы заставляют мышечную ткань сокращаться с заданной скоростью. В комплекте несколько электродов, которые закрепляются на определенных участках тела, на которые планируется воздействовать.

Более дорогое удовольствие – электронные импульсные массажеры, а также тренажеры для тренировки мышц рук. Есть еще пояса-тренажеры, разработанные с учетом строения мужских мышц и факторов накопления жировой ткани. В основе работы – инновационная методика концентрированного мышечного сокращения, при которой слабые импульсы тока воздействуют на нервные окончания, заставляя сокращаться всю группу мышц пресса. Технология позволяет прорабатывать одновременно прямые, внутренние и внешние косые мышцы пресса. Применение пояса избавит от лишних объемов, поможет накачать пресс и добавит эффективности аэробным тренировкам. Такие миостимуляторы приводят к усилению тонуса мышц после 2 недель ежедневных «тренировок», уменьшают объем живота через 4 недели занятий, формируют упругий и рельефный мышечный тонус через 8 недель. У них 7 программ тренировки мышц и до 100 логарифмических уровней нагрузки в каждой.

Для максимального результата надо тренироваться по 30–40 минут 5 раз в неделю.

Цена: от 2 000 до 8 990 рублей.

Gi (forum.ixbt.com/post.cgi?id): Стимуляторы разные бывают. Друг приобрел и вроде доволен, вкупе с тренировками помогает.

Skip (forum.ixbt.com/post.cgi?id): Я недавно начал пользоваться. По ощущениям, в зале не удавалось настолько нагрузить пресс.

B.F.Dragon (forum.ixbt.com/post.cgi?id): Взял по случаю «бабочку» – ну этакую фиговину с электродами в виде крыльев, которые сами лепятся на кожу. Главный облом – буквально через 4–5 занятий видимо на эту липкую токопроводящую резину жир поналип – ни фига не проводит (на выходах импульсы идут нормально). Вот думаю, какие бы нормальные электроды присобачить, а главное из чего? По ощущениям девайс прикольный – есть весьма приятный режим массажа, да и мышцы ощутимо сокращаются.

Kiros (forum.ixbt.com/post.cgi?id): Эти стимуляторы можно использовать если только для массажа.

Klaster (forum.ixbt.com/post.cgi?id): С этими стимуляторами очень легко перетренировать мышцу, а это никак не способствует накачке. Так что лучшего средства, чем тренажерка, еще не придумали.

Сергей Ветров (otvet.mail.ru): Женщинам мышцы глубоко пофиг. Проверено временем. А все, что мы делаем в жизни – исключительно ради женщин.

Белый аист (ответы (otvet.mail.ru): Дух надо качать, а не мясо.

bluesky (www.iwoman.ru/phpBB): Мышцы от разрядов болят, так что еще неизвестно, полезно это или вредно. Когда мышцы работают, кровь к ним приливает, идет сжигание жира (мышцы не могут сжигать жир, если они не «вкалывают»!), давление повышается, сердечная мышца тренируется за счет учащенного дыхания (да и кислород «пачками» поступает!). После таких упражнений и жизнь прекрасна, а так, на диване…

Владимир Салимский (otvet.mail.ru): Мое мнение – такой пояс неэффективен. Лучше пресс качать на перекладине (3–5 подходов по 10–15 раз, отдых 1,5 минуты), на наклонной скамейке. Эффективно просто лечь на пол и поднимать ноги: на 60 градусов, за голову. Не менее 3 подходов 3–4 раза в неделю.

Я пытаюсь запустить сценарий CGI в текущей среде из другого модуля Perl. Все работает хорошо, используя стандартные системные вызовы для запросов GET. POST тоже прекрасен, пока список параметров не станет слишком длинным, после чего они будут отключены.

Кто-нибудь сталкивался с этой проблемой или предлагал какие-либо другие способы попробовать?

Следующие несколько упрощены для ясности. Существует более проверки ошибок и т.д.

Для GET запрашивает и POST запросов без параметров , я делаю следующее:

# $query is a CGI object. my $perl = $^X; my $cgi = $cgi_script_location; # /path/file.cgi system {$perl} $cgi;

  • Параметры передаются через окружающую среду QUERY_STRING переменная.
  • STDOUT захватывается вызовом сценария, поэтому, независимо от того, что CGI-скрипт ведет себя как обычно.
  • Эта часть работает.

Для запросов POST с параметрами следующие работы, но по-видимому, ограничивает мою доступную длину запроса:

# $query is a CGI object. my $perl = $^X; my $cgi = $cgi_script_location; # /path/file.cgi # Gather parameters into a URL-escaped string suitable # to pass to a CGI script ran from the command line. # Null characters are handled properly. # e.g., param1=This%20is%20a%20string¶m2=42&... etc. # This works. my $param_string = $self->get_current_param_string(); # Various ways to do this, but system() doesn"t pass any # parameters (different question). # Using qx// and printing the return value works as well. open(my $cgi_pipe, "|$perl $cgi"); print {$cgi_pipe} $param_string; close($cgi_pipe);

  • Этот метод работает для коротких списков параметров, но если вся команда получает быть около 1000 символов, список параметров прерван. Вот почему я попытался сохранить параметры в файле; чтобы избежать ограничений оболочки.
  • Если я дамп список параметров из исполняемого CGI скрипт я получаю что-то вроде следующего:

param1=blah
... a bunch of other parameters ...
paramN=whatever
p <-- cut off after "p". There are more parameters.

Другие вещи, которые я сделал, что не помогло или работать

  • Сохраненные параметры в файле с помощью CGI-> save(), передаются этот файл в CGI скрипт. С помощью этого метода считывается только первый параметр.

$> perl index.cgi < temp-param-file

  • Сохраненный $ param_string в файл, минуя этот файл сценария CGI так же, как выше. Те же ограничения, что и передача команд через командную строку; все еще отключается.
  • Убедитесь, что $CGI::POST_MAX приемлемо высокий (это -1).
  • Убедитесь, что обработка командной строки CGI работает. (: no_debug не установлен)
  • Отбросить CGI из командной строки с теми же параметрами. Это работает.

Ведет

  • Очевидно, что это похоже на предел символов оболочки Perl использует, чтобы выполнить команду, но она не была решена путем передачи параметров через файл.

Прежде, чем меня объявят съехавшим с катушек фриком, оговорюсь, что это делалось для борды, где наличествует всего 64MiBs оперативной памяти (из которой больше половины сжирал запущенный софт). И (из-за специфичности задачи), я решил юзать bash подцепленный к lighttpd через cgi (гусары – молчать!) Тащить туда тяжелую артиллерию (php или python), усложняло код серверсайд части, да и вообще пахло садомазохизмом.
Ладно, в общем потихонечку я дошел до ручки необходимости загружать на борду файлы через POST. Разумеется, начал я с гуглежа решения, и даже нашел одно. Но к сожалению, у него был недостаток.

Если посмотреть на тот код по ссылке, то можно увидеть примерно следующее

if [ "$REQUEST_METHOD " = "POST" ] ; then TMPOUT =/ tmp/ fwupdate cat > $TMPOUT # Get the line count LINES =$(wc -l $TMPOUT | cut -d " " -f 1 ) # Remove the first four lines tail -$((LINES - 4 ) ) $TMPOUT > $TMPOUT .1 # Remove the last line head -$((LINES - 5 ) ) $TMPOUT .1 > $TMPOUT # Copy everything but the new last line to a temporary file head -$((LINES - 6 ) ) $TMPOUT > $TMPOUT .1 # Copy the new last line but remove trailing \r\n tail -1 $TMPOUT | perl -p -i -e "s/\r\n$//" >> $TMPOUT .1 fi

if [ "$REQUEST_METHOD" = "POST" ]; then TMPOUT=/tmp/fwupdate cat >$TMPOUT # Get the line count LINES=$(wc -l $TMPOUT | cut -d " " -f 1) # Remove the first four lines tail -$((LINES - 4)) $TMPOUT >$TMPOUT.1 # Remove the last line head -$((LINES - 5)) $TMPOUT.1 >$TMPOUT # Copy everything but the new last line to a temporary file head -$((LINES - 6)) $TMPOUT >$TMPOUT.1 # Copy the new last line but remove trailing \r\n tail -1 $TMPOUT | perl -p -i -e "s/\r\n$//" >>$TMPOUT.1 fi

Невооруженным глазом видно, что все это добро складывается в несколько временных файлов. И вот тут мы имеем проблемы, так как у меня и флешка на этой борде из разряда слоупоков, и лишний раз нагружать ее ерейзами не хочется, и оперативной памяти не хватит, чтобы все это сделать в tmpfs. Мысли? Пришлось написать свою… реализацию.

#!/bin/bash OIFS ="$IFS " read boundary read disposition read ctype read junk #Holy fuck, this sucks! #Due to \n\r line breaks we have 2 extra bytes per line read, #6 + 2 newlines == 10 junk bytes a =${#boundary} b =${#disposition} c =${#ctype} a =$((a* 2 +b+c+d+10 ) ) IFS ="${IFS} &:" set $QUERY_STRING dir =$1 file =$2 SIZE =$((HTTP_CONTENT_LENGTH-a) ) echo "Content-Type: text/html" echo "" echo "Upload complete, $SIZE bytes stored
"
echo "Written to $dir , filename $2 ($dir /$file )
"
dd ibs =1 obs =512 count =$SIZE of =$dir / $file

#!/bin/bash OIFS="$IFS" read boundary read disposition read ctype read junk #Holy fuck, this sucks! #Due to \n\r line breaks we have 2 extra bytes per line read, #6 + 2 newlines == 10 junk bytes a=${#boundary} b=${#disposition} c=${#ctype} a=$((a*2+b+c+d+10)) IFS="${IFS}&:" set $QUERY_STRING dir=$1 file=$2 SIZE=$((HTTP_CONTENT_LENGTH-a)) echo "Content-Type: text/html" echo "" echo "Upload complete, $SIZE bytes stored
" echo "Written to $dir, filename $2 ($dir/$file)
" dd ibs=1 obs=512 count=$SIZE of=$dir/$file

Вот и все! Ни временных файлов, ни нет необходимости буферизовать весь файл в памяти, как делает PHP. просто один небольшой dd и немного особой магии, для того, чтобы рассчитать откуда и сколько ддшить.
Разумеется, реализация тупа как дуб, ни каких POST переменных формочки, только сам файл. Потому имя и путь для файла я передаю GET’ом, разделенные ‘:’.
В таком виде, это, конечно, дыра в безопасности размером… Не будем говорить каких размеров. Но так как из-за спейифики задачи, мне вообще надо лазить по физической памяти камня из JS в браузере… Почему бы и нет. Только не забудьте пристрелить того, кто это решит использовать на боевом сервере в продакшне.

jQuery.post(url [, data] [, success(data, textStatus, jqXHR)] [, dataType])

url
Тип: строка
Адрес, на который отправляется запрос.

data
Тип: объект или строка
Данные, отправляемые на сервер в виде объекта (ключ:значение) или строки.


Тип: функция
Функция, вызываемая при успешном завершении Ajax запроса.

dataType
Тип: строка
Тип данных, ожидаемых в качестве ответа от сервера. По умолчанию jQuery определит сам.

Опции:

url - адрес, на который отправляется запрос.
data - данные, отправляемые на сервер в виде формате map (наборы ключ:значение) или string (строка)
success(data, textStatus, jqXHR) - функция, вызываемая при успешном завершении ajax-запроса.
dataType - Тип данных, ожидаемых от сервера. По умолчанию jQuery определит сам.

$.post() эквивалетна:

$.ajax({ type: "POST", url: url, data: data, success: success, dataType: dataType });

Функция обратного вызова success, принимает ответ от сервера, который может быть в виде XML, строки, JavaScript файла или объекта JSON, в зависимости от MIME типа ответа. Это значение так же помещается в статус ответа.

Начиная с версии 1.5 , функция обратного вызова success принимает объект jqXHR (в ранних версиях объект XMLHttpRequest). Классическое использование метода:

$.post("ajax/test.html", function(data) { $(".result").html(data); alert("Загрузка завершена."); });

Данный код делает запрос к HTML файлу и выводит его содержимое.

Страницы полученные в результате POST запроса не кэшируются ни при каких условиях.

Объект jqXHR

Начиная с версии 1.5 , $.post() возвращает объект jqXHR, реализующий интерфейс deferred, что позволяет задавать дополнительные обработчики. Помимо стандартных для объекта deferred методов.done(), .fail() и.then(), с помощью которых можно устанавливать обработчики, в jqXHR реализованы их копии: .success(), .error() и.complete(). Это сделано для соответствия привычным названиям методов, с помощью которых устанавливаются обработчики выполнения ajax-запросов.

// запускаем ajax-запрос, устанавливаем обработчики событий. // Возвращаемые методом $.get объект сохраним в переменной jqxhr для дальнейшего использования var jqxhr = $.post("example.php", function() { alert("success"); }) .done(function() { alert("second success"); }) .fail(function() { alert("error"); }) .always(function() { alert("finished"); }); // установим еще один обработчик завершения запроса jqxhr.always(function(){ alert("second finished"); });

Заметка об устаревших методах

Функции обратного действия, введённые в jQuery 1.5 устарени в версии 1.8 . Вместо jqXHR.success(), jqXHR.error() и jqXHR.complete() теперь следует использовать jqXHR.done(), jqXHR.fail() и jqXHR.always().

Примеры

Сделать запрос к test.php, игнорируя ответ:

$.post("test.php");

Сделать запрос к test.php, передать данные, игнорировать ответ:

$.post("test.php", { name: "John", time: "2pm" });

Передать массив данных на сервер, игнорируя ответ:

$.post("test.php", { "choices": ["Jon", "Susan"]});

Обработать ответ от сервера (HTML или XML в зависимости от того, что пришло):

$.post("test.php", function(data) { alert("Data Loaded: " + data); });

Сделать запрос к test.cgi, предать данные, обработать ответ (HTML или XML в зависимости от того, что пришло):

$.post("test.cgi", { name: "John", time: "2pm" }) .done(function(data) { alert("Data Loaded: " + data); });

Получить от сервера ответ в JSON формате и вывести его на страницу ("John","time"=>"2pm")); ?>):

$.post("test.php", function(data) { $("body").append("Name: " + data.name) // John .append("Time: " + data.time); // 2pm }, "json");

Отправка формы POST запросом и отображение результата в div

$.ajax({