Урок 8 — Как залить картинку

Урок 8 — Как залить картинку

Сегодня мы научимся заливать картинки. На большинстве серверов для этого используется формат multipart/form-data, который является довольно громоздким для написания вручную. Благодаря Viking.Engine загрузка картинок происходит так же просто как и обычный запрос.

Итак, давайте посмотрим как все это выглядит. Для примера будем заливать картинки на http://radikal.ru. Запрос, который браузер посылает при загрузке картинки выглядит вот так:

POST http://www.radikal.ru/action.aspx HTTP/1.1
Host: www.radikal.ru
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------4827543632391
Content-Length: 4760

-----------------------------4827543632391
Content-Disposition: form-data; name="upload"

yes
-----------------------------4827543632391
Content-Disposition: form-data; name="F"; filename="Error.png"
Content-Type: image/png

[данные картинки]
-----------------------------4827543632391
Content-Disposition: form-data; name="M"

640
-----------------------------4827543632391
Content-Disposition: form-data; name="JQ"

85
-----------------------------4827543632391
Content-Disposition: form-data; name="IM"

7
-----------------------------4827543632391
Content-Disposition: form-data; name="VM"

180
-----------------------------4827543632391
Content-Disposition: form-data; name="R"

0
-----------------------------4827543632391
Content-Disposition: form-data; name="VE"

yes
-----------------------------4827543632391--

Основные отличия от обычного запроса это заголовок Content-Type: multipart/form-data; boundary=… и формат POST-данных. В запросах такого формата каждый парамер идет со специальным разделителем и может иметь свои заголовки. Аналогичный простой POST-запрос выглядел бы вот таким образом:

POST http://www.radikal.ru/action.aspx HTTP/1.1
Host: www.radikal.ru
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:6.0) Gecko/20100101 Firefox/6.0
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded;
Content-Length: 4230

upload=yes&M=640&JQ=85&IM=7&VM=180&R=0&VE=yes&F=[данные картинки]

Согласитесь, выглядит гораздо короче. Я тоже так подумал, и написал класс, который преобразует обычные запросы в multipart/form-data формат. Вот как им пользоваться:

Image img = Image.FromFile(@"...");
string post = MultipartContentFormatter.MakeString("upload=yes&M=640&JQ=85&IM=7&VM=180&R=0&VE=yes&F={0}", img);
var ans = VkRequest.Request("http://www.radikal.ru/action.aspx", post, additionalHeaders: MultipartContentFormatter.Header);

Функция MakeString() преобразует обычный запрос в multipart-формат. Ее использование аналогично String.Format(), при этом в параметрах можно вставлять классы Image и byte[]. Если вам понадобится больше функциональности (например указать формат картинки или дополнительный заголовок), то можно создать новый экземпляр этого класса и использовать его по аналогии со StringBuilder.

Обратите также внимание, что в запросе присутствует дополнительный заголовок MultipartContentFormatter.Header, он всегда равен multipart/form-data; boundary=b358fdj4ha19fdk

Вот и все на сегодня, дальше думаю сами легко разберетесь. Вот исходник урока: RadikalUploader

Comments are closed.