место в рейтинге
  • 234038
  • 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
933

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

Комментарии

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

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

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

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

Мой дом – не гостиница. Я не останавливаюсь у своей родни, потому что знаю, что это такое

Мой дом – не гостиница. Я не останавливаюсь у своей родни, потому что знаю, что это такое

Наступил долгожданный момент и мы смогли заселиться в собственную квартиру. А потом началось... Все знакомые, родственники, даже коллеги и соседи родителей вспомнили о нашем существовании.
Idealovnet
14 окт. 2017 / 20:38
  • 8869
  • 82
Работа на EXPO. «Улыбайтесь, вы – лица Казахстана»

Работа на EXPO. «Улыбайтесь, вы – лица Казахстана»

Продление перерывов, втыки от менеджеров, борьба за стенды, кучкования, как мы друг-друга прикрывали, защищали от гостей. Все эти события доставляли радость, и каждый день на работу я приходила...
madiNAtty
14 окт. 2017 / 22:34
  • 6113
  • 23
О проститутках, ЗППП и других сексуальных страстях

О проститутках, ЗППП и других сексуальных страстях

У меня обширный сексуальный опыт, и я этим не хвастаюсь. Будь у меня возможность, променял бы это всё на одного партнёра. Но так как с личной жизнью не заладилось, а секс я очень люблю, то приходилось изворачиваться.
bez_prav
18 окт. 2017 / 18:01
Я четко помню тот день, когда мне позвонили друзья и сообщили: «Она выходит замуж»

Я четко помню тот день, когда мне позвонили друзья и сообщили: «Она выходит замуж»

У нас была особенная атмосфера, мы постоянно были вместе, читали треки, летом часто поднимались в горы. Гуляли пешком по ночному городу, иногда до утра. Снимали хату и представляли совместную жизнь...
Dominator-kz
14 окт. 2017 / 22:29
Отчего в Казахстане предвзятое отношение к отечественному продукту?

Отчего в Казахстане предвзятое отношение к отечественному продукту?

Вы когда-нибудь пользовались казахстанской косметикой? Я тоже нет, поэтому сразу же откликнулась на приглашение своего фейсбук-френда протестировать отечественные крема… из Степногорска.
Shimanskaya
16 окт. 2017 / 11:32
  • 2772
  • 30
Я помню тот день, когда мне позвонили друзья и сообщили: «Она выходит замуж». Часть 2

Я помню тот день, когда мне позвонили друзья и сообщили: «Она выходит замуж». Часть 2

Я знал дату свадьбы. За неделю до свадьбы в соцсети "Вконтакте" на все мои последние фото, был проставлен лайк с её профиля. Сердце забилось сильнее. В душе загорелась наивная, крошечная надежда.
Dominator-kz
17 окт. 2017 / 15:41
Мой парень – «тиран». Почему я вступила в такие отношения?

Мой парень – «тиран». Почему я вступила в такие отношения?

История из моей жизни. Я вспоминаю эти отношения и сама не могу понять - как так произошло? А дело в том, что вы и сами не заметите. Это наступает плавно и динамично.
Altynai_JA
18 окт. 2017 / 14:17
«Автобусная неделя». Выдержит ли аким Шымкента давку в общественном транспорте?

«Автобусная неделя». Выдержит ли аким Шымкента давку в общественном транспорте?

Аким Шымкента Габидулла Абдрахимов нашёл решение накопившихся проблем городского транспорта. Все ключевые работники акимата некоторое время будут сами ездить на автобусах.
openqazaqstan
18 окт. 2017 / 10:53
  • 1660
  • 31
Аркадий Волож привел в Казахстан «Яндекс.Лицей». Плакать или радоваться?

Аркадий Волож привел в Казахстан «Яндекс.Лицей». Плакать или радоваться?

"Яндекс.Лицей" зашел в казахстанские школы. План - учить бесплатно программированию, формировать себе кадры и выйти на мощность 10 тысяч школьников в год.
Zhumanova
18 окт. 2017 / 8:36
  • 1453
  • 11