Наверх
15.02.2014, 13:38

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). 

<?xml version="1.0" encoding="iso-8859-1" ?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>

Загружать картинки без получения разрешений от crossdomain.xml сервера можно только с Air-приложений, но не с Flash. Чтобы загружать картинки с любого сайта, проще всего загружать их через php-скрипт своего сайта.

Разместите php-скрипт на сайт. После этого вместо ссылки на картинку везде используйте http://ВАШСАЙТ/proxy.php?path=АДРЕС_КАРТИНКИ . 

Загрузка и обработка изображения

//url - адрес загружаемой фотографии. 

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);
}

Теперь обрабатываем картинку после ее загрузки.

function drawImage(event:Event)
{
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 см. в Списке методов). 

var userid="12345";

VK.api('photos.getWallUploadServer',{ uid: userid },responseFromServer,error);

Функция обработки ошибок.

function error(data: Object):void
{
trace ("Ошибка "+data.error_msg);

//Лучше всего создать динамичное текстовое поле дебаггинга debug в самом приложении и добавлять сообщения ошибок в него.

this.debug.text+=data.error_msg;

}

Этап 2. Загружаем изображение на сервер 

Для загрузки картинки я использовал класс MultipartURLLoader.  Скачать например тут. Ему передаем файл картинки в ByteArray.

function responseFromServer(data)
{
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. Сохранение изображения на стену Вконтакте

Картинка загружена Вконтакте. Теперь сохраняем её на стену пользователю.

function onUploadCompleteThroughAlarm(e:Event)
{
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 программирование

Login NoCENS

Register

Forgot password

Donate


♥ 3
Send link to Twitter
Send to Facebook
Similar posts
Comments
Information

Members of Гости cannot leave comments.