![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 90
|
Пробовал загрузить во флешку аватар пользователя через Loader и URL loader, но в обоих случаях ошибки безопасности.
Вот эти шаги проделал: Security.allowDomain("*"); Security.loadPolicyFile("http://api.vk.com/crossdomain.xml"); var context:LoaderContext = new LoaderContext(); context.checkPolicyFile = true; context.applicationDomain = ApplicationDomain.currentDomain; imageLoader = new Loader(); imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, ImageLoaded); try { imageLoader.load(new URLRequest(url), context); } catch (err:Error) { ui.Print(err.message); handler(null); } private function ImageLoaded(e:Event):void { var bmp:BitmapData = new BitmapData(imageLoader.width, imageLoader.height, true, 0x00FFFFFF); try { bmp.draw(e.target.content); } catch(err:Error) { // и тут я получаю SecurityError: Error #2122: Security sandbox violation: BitmapData.draw } } Подскажите, как правильно загрузить аватар пользователя с его страницы в мое iFrame-приложение? Последний раз редактировалось HorusWM; 07.04.2013 в 20:19. |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 90
|
Только это ничего не меняет, разве что теперь error#2122 сменился на error#2123.
Попробовал вариант описанный тут http://www.flasher.ru/forum/blog.php?b=208 (через Loader.loadBytes(LoaderInfo.bytes)), но LoaderInfo.bytes = null, хотя LoaderInfo.bytesLoaded показывает некое число загруженных байт. Что не так то? Последний раз редактировалось HorusWM; 07.04.2013 в 20:21. |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 90
|
Цитата:
Сделал через обмен данными с сервером: ссылка на фото отправляется ему, он возвращает массив байт, описывающих изображение. Тему можно закрывать. Последний раз редактировалось HorusWM; 08.04.2013 в 12:11. Причина: решение найдено |
|
|||||
|
Регистрация: May 2010
Сообщений: 543
|
__________________
Вы грабите бедных людей. Парень со свирелью накажет вас. Хонгильдон (с) |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 90
|
Цитата:
|
|
|||||
|
Цитата:
Чтобы свой велосипед не изобретать, когда это понадобится Добавлено через 1 час 34 минуты Таки сделал велосипед ) Может кому пригодится Используется 2 класса на клиенте, и небольшой скрипт на сервере Основной, универсальный пакет для запросов к серверу: package client { import flash.events.Event; import flash.events.IOErrorEvent; import flash.events.SecurityErrorEvent; import flash.net.URLLoader; import flash.net.URLLoaderDataFormat; import flash.net.URLRequest; import flash.net.URLRequestMethod; import flash.net.URLVariables; import flash.utils.ByteArray; public class Packet { public static const HOST: String = "http://hostname.com/"; public static const SCRIPT: String = "call.php"; public static var USER_ID: String = "userId"; public static var PASSWORD: String = "pass"; private var _callback: Function = null; private var _isBinary: Boolean = false; /** * * @param method имя метода для передачи в параметр method на сервер * @param callback вызывается когда в ответ на запрос приходят данные * в случае ошибки игнорируется */ public function Packet(method:String, callback:Function, params:Object = null, isBinary:Boolean = false) { _callback = callback; _isBinary = isBinary; var loader: URLLoader = new URLLoader(); loader.addEventListener(Event.COMPLETE, onComplete); loader.addEventListener(IOErrorEvent.IO_ERROR, onIOError); loader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); if (!_isBinary) { loader.dataFormat = URLLoaderDataFormat.VARIABLES; } else { loader.dataFormat = URLLoaderDataFormat.BINARY; } var vars:URLVariables = new URLVariables(); vars['method'] = method; vars['pass'] = PASSWORD; vars['userId'] = USER_ID; if (params != null) { for (var i:String in params) { vars[i] = params[i]; } } var rand: String = "?" + int(Math.random() * 100000); var request:URLRequest = new URLRequest(Packet.HOST + Packet.SCRIPT + rand); request.method = URLRequestMethod.POST; request.data = vars; trace(request.data.toString()); try { loader.load(request); } catch (e:Error) { trace(e.getStackTrace()); } } private function onSecurityError(e:SecurityErrorEvent):void { e.target.removeEventListener(Event.COMPLETE, onComplete); e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError); e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); } private function onIOError(e:IOErrorEvent):void { e.target.removeEventListener(Event.COMPLETE, onComplete); e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError); e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); } private function onComplete(e:Event):void { e.target.removeEventListener(Event.COMPLETE, onComplete); e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError); e.target.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, onSecurityError); if (!_isBinary) { var data:Object = e.target.data as Object; if (_callback != null) { _callback.call(null, data); } } else { var byteArray:ByteArray = e.target.data as ByteArray; if (_callback != null) { _callback.call(null, byteArray); } } } } } package client { import flash.display.Bitmap; import flash.display.Loader; import flash.events.Event; import flash.events.IOErrorEvent; import flash.utils.ByteArray; import flash.system.LoaderContext; /** * загружает картинку с любого домена, * через отправку запроса своему серверу * и получение этой картинки уже от него */ public class ProxiedImage { private var _callback: Function = null; /** * @param imageUrl прямая ссылка на картинку * @param callback метод с единственным параметром image:Bitmap */ public function ProxiedImage(imageUrl:String, callback:Function) { _callback = callback; if (_callback == null) { throw new ArgumentError("callback cannot be null!"); } var packet:Packet = new Packet("getImage", onLoad, { url: imageUrl }, true); } private function onLoad(params:Object):void { if (_callback == null) return; var imageBytes: ByteArray = params as ByteArray; var loader: Loader = new Loader(); loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, onIOError); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete); try { var context:LoaderContext = new LoaderContext(true); loader.loadBytes(imageBytes, context); } catch (e:Error) { loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, onIOError); loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, onComplete); } } private function onComplete(e:Event):void { e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError); e.target.removeEventListener(Event.COMPLETE, onComplete); var image:Bitmap = e.target.content as Bitmap; _callback.call(null, image); } private function onIOError(e:IOErrorEvent):void { e.target.removeEventListener(IOErrorEvent.IO_ERROR, onIOError); e.target.removeEventListener(Event.COMPLETE, onComplete); } } }
там, где надо загрузить картинку с другого домена, создаем метод, в который будет возвращаться картинка: private function onImageLoaded(image:Bitmap):void { addChild(image); // вуаля, картинка добавлена } Все, после загрузки картинка передастся как аргумент созданному методу Последний раз редактировалось caseyryan; 23.05.2013 в 14:08. Причина: Добавил запрос контекста |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 90
|
У нас немножко по-другому:
Есть отдельный сайт со страницей-генератором на нем, типа http://НекийСайт.com/Default.aspx?img=, который мы передаем как путь +url аватарки для загрузки как параметр. Т.е., выглядит примерно так: url = "http://НекийСайт.com/Default.aspx?img=" +"http://cs416319.vk.me/бла-бла-бла.jpg"; imageLoader.load(new URLRequest(url), context); Скрипт страницы (там 5-10 строк, в общем-то) и длл сейчас выковырять не могу, серверный программист не на месте. Кстати, caseyryan, у вас ошибка безопасности не вылезает там без LoaderContext? |
|
|||||
|
Цитата:
Цитата:
|
![]() |
![]() |
Часовой пояс GMT +4, время: 11:39. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|