Загрузка файлов на сервер: php+C#

31 июл. 2012 г. | | |

Сценарий простой: клиент (winforms) хочет править миром загружать файлы на сервер (php). Первая мысль - использовать WebClient, у которого есть замечательный метод UploadFileAsync. На сервер вместе с файлом нужно передать пару-тройку дополнительных параметров, т.е. отправить стандартную форму типа:
<form action="http://localhost/uplad.php" enctype="multipart/form-data" method="POST">
<input type="text" name="title" value="" />
<input type="text" name="description" />
<input type="FILE" name="uploadfile" />
<input type="submit" name="send" value="Upload" />
</form>
И тут начинаются проблемы. Теоретически, это можно сделать, используя QueryString у WebClient:
If the QueryString property is not an empty string, it is appended to address. [MSDN]
Но практически тут нужен бубен:
Unfortunately, most file upload scenarios are HTML form based and may contain form fields in addition to the file data. This is where WebClient falls flat. After review of the source code for WebClient, it is obvious that there is no possibility of reusing it to perform a file upload including additional form fields.  [CodeProject]

FuckMeGentlyWithAChainsaw

| | |

 Код из клиента одной онлайн игрушки, процитирован дословно. via http://govnokod.ru/11504

WTF?

28 июл. 2012 г. | | |


Загадки старого кода

26 июл. 2012 г. | | |

Иногда очень занятно копаться в старом коде. Особенно в своём. Порой натыкаешься на гениально загадочные вещи, как-то:
if (level <= 5 && level > 4){ ... }
else
{
          if (level <= 6 && level > 5) { ... }
          else
                 if (level > 6) { ... }
 };
Давайте не будем обращать внимание на количество if-else операторов, на "магические числа"  и сфокусируем взгляд на проверяемых значениях в условных операторах. Этот феномен можно было бы попытаться  объяснить, если код был бы написан на языке с нестрогой типизацией, например, на том же php или javascript: в диапазон (4.0; 5.0] могло попасть множество значений (даже строка "4.098" т.к. в момент сравнения она будет автоматически преобразована в число с плавающей точкой - для php [1]). Но нет же!
C# является строго типизированным языком. Каждая переменная и константа имеет тип, как и каждое выражение, результатом вычисления которого является значение. Каждая сигнатура метода задает тип для каждого входного параметра и для возвращаемого значения.  [MSDN]
Остаётся мучиться в догадках, что за мистическая цифра могла бы находиться в целочисленном диапазоне (4; 5] кроме цифры 5. :)

[1] http://it2.php.net/manual/en/language.types.string.php см. раздел "String conversion to numbers":
When a string is evaluated in a numeric context, the resulting value and type are determined as follows.
If the string does not contain any of the characters '.', 'e', or 'E' and the numeric value fits into integer type limits (as defined by PHP_INT_MAX), the string will be evaluated as an integer. In all other cases it will be evaluated as a float.

Бунт строковых функций, нечувствительных к регистру, и явное указание локали в PHP

| | |

Простая задача: сделать поиск по каталогу продуктов на сайте, если б не возникла проблема - функции для работы со строками stripos, strripos, preg_replace (с ключом i ) и иже с ними вдруг стали чувствительны к регистру. В документе явно прописана кодировка и язык: 
<meta http-equiv="content-type" content="text/html; charset=windows-1251" />
<meta name="language" content="Russian"/>
<meta http-equiv="content-language" content="ru-RU" />
Решилась проблема явным указанием локали в скрипте перед вызовом выше обозначенных функций:
 setlocale(LC_ALL ,'ru_RU.CP1251');

Активный отдых мозгами

| | |

Я обожаю всякие квесты, особенно те, что связаны с профессией. Поэтому, с удовольствием прошла тест и поучаствовала в квесте ко дню сисадмина на admin2012.ru от компании Ideco.