место в рейтинге
  • 231591
  • 2163
  • 79
Нравится блог?
Подписывайтесь!

HTTP POST изображений на PHP с Windows Phone 8

На днях, разрабатывая приложения для Windows Phone 8 я наткнулся на одну проблем, все еще актуальную при разработке клиент-серверных приложений с бэк-эндом на PHP(и не только).

Проблема в общих чертах обрисовывалась так "Как отправить изображение POST запросом на PHP сервер с Windows Phone". И Stackoverflow буквально разрывается от подобных вопросов, но осмысленных или правильных(работающих по сей день я не нашел).

Но после двух дней мучений я все же нашел решение.

Занимаясь разработкой под Windows RT я очень привык к HTTPClient, который большинство дел берет на себя и тебе не приходиться много париться. Но начиная разработку под Windows Phone, понимаешь что Microsoft учли все ошибки допущенные в Windows Phone и исправили их Windows RT, что кстати прекрасно.

Но у меня получился Downgrade. И без моего любимого HTTPClient мне пришлось тяжко.

У меня на вооружении были 2 варианта работы с HTTP: первый это WebClient(предшественник HTTPClient) и HTTPWebRequest. Разница между ними в том что WebClient проще, а HTTPWebRequest дает больше возможностей и контроля. И я решил использовать второй вариант.

Начнем с создания кнопки и привязывания к ней метода:

Кнопка:

<shell:ApplicationBarIconButton IconUri="/Images/Camera.png" Text="Изменить аватар" Click="EditAvatarApp" />

Метод обработки события:

private void EditAvatarApp(object sender, EventArgs e)

{

selectphoto = new PhotoChooserTask();

selectphoto.Completed += new EventHandler<PhotoResult>(selectphoto_Completed);   selectphoto.Show();

}

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

selectphoto_Completed.(описание ниже) Что мы и делаем.

void selectphoto_Completed(object sender, PhotoResult e)

{

feed = new UploadAvatar();

if (e.TaskResult == TaskResult.OK)

{

var memoryStream = new MemoryStream();

e.ChosenPhoto.CopyTo(memoryStream);

byte[] results = memoryStream.ToArray();

WebRequest request = HttpWebRequest.Create("http://mysite.com/upload.php");

request.Method = "POST";

request.ContentType = "application/x-www-form-urlencoded";

request.BeginGetRequestStream((reqResult) =>

{

using (Stream strm = request.EndGetRequestStream(reqResult))

using (StreamWriter writer = new StreamWriter(strm))

{

writer.Write("&message=" + HttpUtility.UrlEncode("Im testing upload"));

writer.Write("&avatar=" + HttpUtility.UrlEncode(System.Convert.ToBase64String(results)));

}

request.BeginGetResponse((result) =>

{

try

{

var response = request.EndGetResponse(result);

using (var rstrm = response.GetResponseStream())

{

var serializer = new DataContractJsonSerializer(typeof(UploadAvatar));

var postResponse = serializer.ReadObject(rstrm) as UploadAvatar;

feed = postResponse;

localSettings.Remove("avatar");

localSettings.Add("avatar", postResponse.link);

}

}

catch (Exception ex)

{

}

}, null);

}, null);

MessageBox.Show("Ваш аватар успешно обновлен");

}

}

Если коротко мы превращаем выбранное изображение в поток,а поток кодируем в base64 и отправляем на сервер в виде одного из аргументов.

Теперь посмотрим на серверную часть:

if (isset($_POST['avatar']))

{

$date=time();

$img = base64_decode($_POST["avatar"]);

$im = imagecreatefromstring($img);

if ($im !== false) {

header('Content-Type: image/png');

imagepng($im,"/public/avatars/".$date.".jpg");

imagedestroy($im);

}

else {

echo 'An error occurred.';

}

}

$avatar = $date.".jpg";

$responce["success"] = 1;

$responce["link"] =  "http://mysite.com/public/avatars/".$avatar;

$responce = json_encode($responce);

echo $responce;

Сервер принимает пост, и декодирует Base64 и штатными методами создает изображение и сохраняет там где нам нужно. И сервер отвечает json.

Теперь поговорим немного о получении и десериализации ответа сервера.

Вас немогли не ввести в недоумение эти строчки:

feed = new UploadAvatar();

var serializer = new DataContractJsonSerializer(typeof(UploadAvatar));

var postResponse = serializer.ReadObject(rstrm) as UploadAvatar;

feed = postResponse;

Скажу сразу, чтобы получить и сохранить ответ сервера нужен идентичный ответу, класс. Например в  нашем случае Upload avatar:

public class UploadAvatar

{

public int success { get; set; }

public string link { get; set; }

}

И как мы видим наш класс полностью идентичен ответу сервера.

$responce["success"] = 1;

$responce["link"] =  "http://mysite.com/public/avatars/".$avatar;

$responce = json_encode($responce);

echo $responce;

Вот и вся магия.

С вами был я. Подписываетесь на мой твиттер: @khojabergen

Дулат Ходжаберген Stark
Мои интересы скажут, обо мне больше, чем я сам когда -либо смогу.
8 июня 2013, 9:17
922

Загрузка...
Loading...

Комментарии

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

СМИ – ассистент провокаторов? Как гости из соседних стран сеют раздор в Казахстане

СМИ – ассистент провокаторов? Как гости из соседних стран сеют раздор в Казахстане

Инцидент с пьяным киргизским гостем на борту Air Astana, наверное, остался бы только во внутренних сводках авиакомпании, если бы г-н Доган, не поднял громкий крик о государственном языке.
openqazaqstan
17 авг. 2017 / 14:43
  • 11857
  • 177
Дайте Байбеку сломать и переделать город. Он хочет шагнуть вверх, а не бабло украсть

Дайте Байбеку сломать и переделать город. Он хочет шагнуть вверх, а не бабло украсть

Я в тогдашней Алма-Ате родился, вырос. В школу начал ходить пешком. Весь центр опползал. Все эти знаковые места помню как ещё не знаковые места. Никаких этих ностальгических страданий у меня нет.
Aidan_Karibzhanov
21 авг. 2017 / 16:25
  • 4688
  • 29
Казахский национализм раньше выглядел несовременно. Теперь он другой

Казахский национализм раньше выглядел несовременно. Теперь он другой

Националисты стали совсем другими. По-английски хорошо говорят, русскую классику цитируют. Очень современные, образованные, адекватные. А после Крыма в националисты уже чуть ли не любой казах готов был записаться.
Aidan_Karibzhanov
16 авг. 2017 / 16:52
Имеющий уши да услышит. Латиница касается только казахского языка

Имеющий уши да услышит. Латиница касается только казахского языка

Президент Назарбаев наконец-то разъяснил для всех, кто ещё не понял, очевидный вопрос, который всем в Казахстане очевиден. Елбасы повторил: на латиницу мы переводим казахский язык, и это не означает отказ от русского языка.
openqazaqstan
18 авг. 2017 / 16:23
  • 3453
  • 52
Подземная Акмечеть Бекет-Ата в Атырауской области – одно из самых сакральных мест

Подземная Акмечеть Бекет-Ата в Атырауской области – одно из самых сакральных мест

Его отцом был Мырзагул, матерью Жания, оба глубоко верующие. По рассказам, Бекет-Ата обладал богатырской силой, что в том числе помогало выбивать мечети в крепких скалах.
theYakov
21 авг. 2017 / 17:21
  • 2438
  • 3
«Доехать до Алтын Орды» – как мошенники обманывают алматинцев

«Доехать до Алтын Орды» – как мошенники обманывают алматинцев

Из множества грустных откровений постепенно сложился перечень самых распространённых уловок охотников за нашими деньгами. В нём ожидаемо лидировали профессиональные попрошайки.
caravan_kz
16 авг. 2017 / 15:05
  • 2350
  • 4
Надо научиться видеть скрытые экономические процессы за вспышкой национального гнева

Надо научиться видеть скрытые экономические процессы за вспышкой национального гнева

При полном отсутствии бюджетного жилищного строительства, целые аулы оседают в ветхих домишках, сквозь заборы которых насмешливо возвышаются башни "коктемов", "риц карлтонов" и "есентаев".
niyazov
19 авг. 2017 / 11:16
  • 2506
  • 67
В Кокшетау строят два парка для молодёжи. Будут учтены интересы и любителей спорта

В Кокшетау строят два парка для молодёжи. Будут учтены интересы и любителей спорта

Общая площадь парка составляет 25 гектаров. На территории предусмотрено устройство прогулочных дорожек, площадок для установки аттракционов и павильонов различного назначения, цветников.
zhasakmola
17 авг. 2017 / 17:13
  • 2152
  • 1
«Нас и здесь неплохо кормят», или почему я не собираюсь уезжать из Казахстана

«Нас и здесь неплохо кормят», или почему я не собираюсь уезжать из Казахстана

Я всегда теряюсь, когда слышу этот вопрос, потому что я так и не сумел выразить причину одной фразой. Давайте рассмотрим популярные варианты, и я объясню, что именно мне в них не нравится.
convoluted
21 авг. 2017 / 12:29