Показать сообщение отдельно
Старый 13.04.2013, 13:52
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 8  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от HorusWM Посмотреть сообщение
Сделал через обмен данными с сервером: ссылка на фото отправляется ему, он возвращает массив байт, описывающих изображение. Тему можно закрывать.
А можно глянуть серверный код который это делает?
Чтобы свой велосипед не изобретать, когда это понадобится

Добавлено через 1 час 34 минуты
Таки сделал велосипед ) Может кому пригодится

Используется 2 класса на клиенте, и небольшой скрипт на сервере
Основной, универсальный пакет для запросов к серверу:
Код AS3:
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);
				}
			}
		}
	}
}
Вспомогательный пакет для загрузки изображения:

Код AS3:
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);
		}
	}
}
Ну и php скрипт, который грузит картинку и возвращает байты
PHP код:
$method $_POST['method'];
if (
$method == "getImage") {
    
$url    $_POST['url'];
           
$url_reg "/(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/";
    if (
preg_match($url_reg$url)) {
        
$file    file_get_contents($url);
        echo 
$file;
    }
    

Используется все просто.
там, где надо загрузить картинку с другого домена, создаем метод, в который будет возвращаться картинка:

Код AS3:
 
private function onImageLoaded(image:Bitmap):void {
       addChild(image); // вуаля, картинка добавлена
}
и отправляем запрос на загрузку картинки серверу
Код AS3:
var pi:ProxiedImage = new ProxiedImage("http://example.com/image.jpg", onImageLoaded);
Все, после загрузки картинка передастся как аргумент созданному методу


Последний раз редактировалось caseyryan; 23.05.2013 в 14:08. Причина: Добавил запрос контекста