ActionScript 3.0: как загрузить изображение из Интернета и сохранить Вконтакте
Решил разместить в открытый доступ всё, что касается загрузки изображения из Интернета во Flash-приложение и сохранения этого изображения Вконтакте. Надеюсь, подобные статьи позволят увидеть больше хороших приложений для Вконтакте на языке Actionscript 3.0 (Flash/Air). Возможно, кому-то понадобится только загрузка изображения или сохранение изображения Вконтакте, но думаю, что тем, кто сталкивается с этим впервые, будет полезно и то, и другое.
Загрузка изображения из Интернета в Flash
Обходим защиту от загрузки сторонних картинок
Важно! Флэш НЕ будет загружать картинку с сервера без получения разрешения от него. Также нужно разрешить домен в самом флэше.
Security.allowDomain("*");
Security.allowInsecureDomain("*");
//Загрузить файл с разрешением от сервера (укажите путь к файлу crossdomain.xml на нужном сервере).
Security.loadPolicyFile("http://www.helpexamples.com/crossdomain.xml");
Чтобы загружать файлы с Вашего сайта, добавьте в корень crossdomain.xml следующего содержания (можно скопировать с HelpExamples).
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
Загружать картинки без получения разрешений от crossdomain.xml сервера можно только с Air-приложений, но не с Flash. Чтобы загружать картинки с любого сайта, проще всего загружать их через php-скрипт своего сайта.
Разместите php-скрипт на сайт. После этого вместо ссылки на картинку везде используйте http://ВАШСАЙТ/proxy.php?path=АДРЕС_КАРТИНКИ .
Загрузка и обработка изображения
var url:String = "http://www.helpexamples.com/flash/images/logo.png";
var fl_Loader = new Loader();
var byteArray:ByteArray = new ByteArray();
//вызываемая функция загрузки фотографии
function fl_ClickToLoadUnloadSWF():void
{
fl_Loader = new Loader();
fl_Loader.load(new URLRequest(url));
fl_Loader.contentLoaderInfo.addEventListener(Event.COMPLETE, drawImage);
}
Теперь обрабатываем картинку после ее загрузки.
{
var myBitmap:BitmapData = new BitmapData(fl_Loader.width, fl_Loader.height, false);
myBitmap.draw(fl_Loader, new Matrix());
var jpgEncoder:JPGEncoder = new JPGEncoder(100);
byteArray = jpgEncoder.encode(bdata);
}
Для преобразования картинки в ByteArray используется JPGEncoder. В современных версиях Adobe Flash не нужно загружать класс из сети, достаточно подключить нативную библиотеку import com.adobe.images.JPGEncoder;
Если Ваша версия Flash Professional / Flash Develop не находит такую библиотеку, подключаем ru.inspirit.image.encoder.JPGEncoder;
Сохранение изображения на стену Вконтакте
Для того, чтобы быстро делать запросы Вконтакте, к приложению должна быть подключена библиотека VK.Api, взять её можно здесь (import vk.*;). Чтобы появился доступ к API, нужно авторизоваться и получить ключ доступа (access_token) - для приложений, загруженных в сам Вконтакте это очень просто:
private var flashVars: Object = stage.loaderInfo.parameters as Object;
private var VK: APIConnection = new APIConnection(flashVars);
Чтобы VK.Api работал, приложение в его настройках Вконтакте должно быть "Включено и видно всем", а также должны быть проставлены права на нужные действия (доступ к стене и др. по необходимости). Допустим, что всё это сделать получилось, тогда можно загружать картинку в три этапа.
Этап 1. Получаем сервер для загрузки картинки
userid - номер пользователя (можно получить через friends.get). Если не указан uid - постит на Вашу стену. Если постить в группу, то пишем gid: номер группы (все методы VK.API см. в Списке методов).
VK.api('photos.getWallUploadServer',{ uid: userid },responseFromServer,error);
Функция обработки ошибок.
{
trace ("Ошибка "+data.error_msg);
//Лучше всего создать динамичное текстовое поле дебаггинга debug в самом приложении и добавлять сообщения ошибок в него.
this.debug.text+=data.error_msg;
}
Этап 2. Загружаем изображение на сервер
Для загрузки картинки я использовал класс MultipartURLLoader. Скачать например тут. Ему передаем файл картинки в ByteArray.
{
mll = new MultipartURLLoader();
mll.addEventListener(Event.COMPLETE, onUploadCompleteThroughAlarm);
mll.addFile(byteArray, "file.jpg", "file1", 'image/jpg');
mll.load(data.upload_url);
}
ВАЖНО! Существует два конфликтующих класса JSON-парсинга: один встроен Вконтакте, другой появился в новых версиях Flash. В новых версиях, ругающихся на DataProvider.as, подключаем import com.adobe.serialization.json.JSON; затем заходим в файл vk/api/DataProvider.as, удаляем import com.adobe.serialization.json.JSON; и заменяем JSON.decode на JSON.parse .
Этап 3. Сохранение изображения на стену Вконтакте
Картинка загружена Вконтакте. Теперь сохраняем её на стену пользователю.
{
var answer:String = mll.loader.data;
var data:Object = JSON.parse(answer);
VK.api('photos.saveWallPhoto', {uid: userid, server:data.server, photo:data.photo, hash:data.hash }, onSaveWallPhoto, error);
}
function onSaveWallPhoto(data)
{
//Произвольная функция, запускающаяся после успешного размещения изображения на стене пользователя.
}
Надеюсь, что смог описать все подводные камни и сэкономил немало нервов начинающим разработчикам флэш-приложений. О том, что упущено или можно сделать лучше, пишите в комментариях. В следующий раз постараюсь рассказать о реализации аналогичной функциональности для Air-приложений и что-нибудь новое. Поддержать это направление статей можно донатом или размещением рекламы в моих приложениях.
технологии ActionScript загрузить изображение Интернета сохранить Вконтакте adobe flash программирование