пятница, 30 ноября 2012 г.

С#: Post запрос multipart/form-data

Необходимо отправить запрос с массивом байт, полученных с картинки:
    private static void sendFile(byte[] bytes, String url)
    {
        try
        {
            HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(url);
            request.Method = WebRequestMethods.Http.Post;
            request.KeepAlive = true;
            request.Credentials = System.Net.CredentialCache.DefaultCredentials;
            request.Timeout = 120000;
            string boundary = "--------" + DateTime.Now.Ticks.ToString("x");
            request.ContentType = "multipart/form-data;charset=utf-8;boundary=" + boundary;
            MemoryStream ms = new MemoryStream();
            StreamWriter sw = new StreamWriter(ms);
            sw.Write("\r\n--" + boundary + "\r\n");
            sw.Write("Content-Disposition: form-data;"
                                    + "name=\"{0}\";"
                                    + "filename=\"{1}\""
                                    + "\r\nContent-Type: {2}\r\n\r\n",
                                    "imagefile",
                                    "image.jpg",
                                    "image");

            sw.Flush();
            ms.Write(bytes, 0, bytes.Length);
            sw.Write("\r\n--" + boundary + "--\r\n");
            sw.Flush();
            request.ContentLength = ms.Length;
            System.IO.Stream sendStream = request.GetRequestStream();
            ms.WriteTo(sendStream);
            ms.Close();
            WebResponse response = request.GetResponse();
        }
        catch (WebException e)
        {
            Console.WriteLine(e);
            System.Windows.Forms.MessageBox.Show("Error= " + e);
        }
        catch (Exception e) {
            Console.WriteLine(e);
            System.Windows.Forms.MessageBox.Show("Error= " + e);
        }
    }

C#: System.Drawing.Imaging.ImageFormat from String. Создать формат изображения из строки, содержащей FormatId константу.

В Windows присутствуют следующие стандартные типы изображений с id их форматов:
bmp = "{b96b3cab-0728-11d3-9d7b-0000f81ef32e}"
jpeg = "{b96b3cae-0728-11d3-9d7b-0000f81ef32e}"
png = "{b96b3caf-0728-11d3-9d7b-0000f81ef32e}"
gif = "{b96b3cb0-0728-11d3-9d7b-0000f81ef32e}"
tiff = "{b96b3cb1-0728-11d3-9d7b-0000f81ef32e}"


 Получить ImageFormat из кода формата можно след образом:
Guid guid = new Guid("{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}");
System.Drawing.Imaging.ImageFormat format = new System.Drawing.Imaging.ImageFormat(guid);



вторник, 27 ноября 2012 г.

Задача в С#: необходимо перевести Bitmap в bytes array

//используем отражение для  вызова метода
MethodInfo mi = typeof(Bitmap).GetMethod("FromGDIplus", BindingFlags.Static | BindingFlags.NonPublic);
IntPtr img = IntPtr.Zero;
//создаём bitmap на основе BITMAPINFO и массива пикселей
int st = GdipCreateBitmapFromGdiDib(bmpptr, pixptr, ref img2);
if (st == 0 && img != IntPtr.Zero) {
  Bitmap bm = (Bitmap)mi.Invoke(null, new object[] { img2 });
  MemoryStream ms = new MemoryStream();
 //сохраняем bitmap в поток в формате jpeg
  bm.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
//перевод потока в массив
  byte[ ] bytes = ms.ToArray();
}
                   

вторник, 6 ноября 2012 г.

Аналог fuse для Windows. Монтирование диска по ssh. Просмотр логов сервера в on-line режиме.

При разработке веб-приложений в Windows надоело постоянно залезать по ssh на сервер, заливать туда дистрибутивы, копировать на локальную машину логи и разбирать их в текстовом редакторе. Захотелось по аналогии с Linux что-то вроде fuse.
Нашлась реализация sshfs и для Windows - Dokan SSHFS.

Порядок действий таков:
  1. Качаем и ставим отсюда  Dokan Library, Dokan SSHFS
  2. Ставим, если не установлен Microsoft .NET Framework 3.5 
  3. Ставим, если не установлен  Microsoft Visual C++ 2005 SP1 Redistributable Package
  4. Запускаем DokanSSHFS.exe, прописываем настройки коннекта (варианты авторизации по ключу и по паролю), выбираем букву диска.
После это в файловой системе появляется смонтированный диск. Преспокойно заливаем дистрибутивы и смотрим логи.

Можно пойти дальше и наблюдать за логами в режиме он-лайн. Достаточно найти текстовый редактор с возможностью проверки обновления содержимого текстого документа. Таким редактором, например, является SnakeTail (почему-то оригинальный tail под Windows не умеет обновлять содержимое в консоль). Открываем лог-файл в редакторе (по умолчанию он настроен на тип файлов log), настраиваем таймеры и режимы обновления. Теперь все действия приложения на сервере видны в on-line. 
Иногда лучше запускать два DokanSSHFS - один под логи, другой для деплоя. Позволит избежать ошибки взаимной блокировки файлов.

воскресенье, 4 ноября 2012 г.

Порадовал себя установкой Windows XP на нетбук HP через сетевое соединение.

Опирался на эту и эту статью.
Понадобились при установке:
tftpd32.400.zip
python-2.7.3.msi
ris-linux-0.4.tar.gz
В процессе настройки возникли следующие проблемы:

1. Неверная кодировка, в которой на нетбуке выводились сообщения об ошибках.

Клиент не мог найти файл BOOTFONT.BIN. Решается вставкой этого файла в корневую папку дистрибутива из корневой папки установочного диска.

2. Ошибка после загрузки сетевой установки на нетбуке "inf-файл txtsetup.sif испорчен или отсутствует, состояние 21".

Заключается в том, что TFTP-сервер ни в какую не хотел находить файл TXTSETUP.SIF. Проблема заключалась в пути, по которому клиент запрашивает с сервера файл. Вместо x:\boot\winxp\install\i386 лез в x:\boot\winxp\winxp\install\i386. После добавления ещё одной промежуточной папки winxp установка продолжилась. Итоговый путь   x:\boot\winxp\winxp\install\i386.
Проверить возможность получения клиентом файла по TFTP можно в самом tftpd32, настроив TFTP-client.
Настройки TFTP-cклиента :
Host - это IP компьютера с дистрибутивом,
порт 69 по умолчанию,
Local file - файл, куда записать полученное содержимое,
Remote file -  запрашиваемый с сервера файл (в данном случае "\winxp\install\i386\txtsetup.sif "),
Block size - Default.
Если при нажатии PUT возникает ошибка -  вероятнее всего файл не найден (смотреть логи на вкладке Logviewer куда ломится клиент)

3. Ошибка в результате выполнения скрипта binlsrv.py "Driver not found".

Появляется из-за того, что скрипт не может найти драйвер сетевого устройства нетбука в списке устройств devlist.cache, сгенерированных infparser.py. Необходимо добавить драйвера сетевой карты нетбука в папки drivers (inf-файлы)  и drivers\sys (sys-файлы).
После этого заново запустить скрипты:
infparser.py x:\boot\winxp\drivers
binlsrv.py


4. После начала загрузки драйверов для установки Windows возникает ошибка "файл  ***.sys испорчен", где ***.sys  - драйвер сетевой карты.

В папке drivers находились драйвера для сетевой карты под другую ОС или битые файлы (скачивал их с сайта HP для данного нетбука одним архивом), после их удаления остался один файл с драйвером под XP, нашёлся клиентом TFTP и установка продолжилась.