package
{
//import imgResizer;
import ButtonInteractivity;
import flash.display.Sprite;
import flash.events.TextEvent;
import flash.text.TextField;
import flash.events.MouseEvent;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.net.FileReferenceList;
import flash.display.Loader;
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.geom.Rectangle;
import flash.net.URLRequest;
import flash.net.URLRequestHeader;
import flash.net.URLRequestMethod;
import flash.net.URLLoader;
import flash.net.URLVariables;
import flash.events.IOErrorEvent;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.events.EventDispatcher;
import flash.utils.ByteArray;
import by.blooddy.crypto.image.JPEGEncoder;
import by.blooddy.crypto.image.PNG24Encoder;
import flash.display.LoaderInfo;
import flash.external.ExternalInterface;
import flash.system.Security;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
/**
* ...
* @author HaifLive
*/
public class Main extends Sprite
{
//private var imgR:imgResizer;
private var _MAX_WIDTH : Number = 640;
private var _MAX_HEIGHT : Number = 480;
private var _loaderURL : String = "
http://test1.ru/jpegencoder/loadFile.php";
private var _buttonSelectText : String = "Browse files";
private var _getParams : String = "";
private var _fileQueue : uint = 0;
private var _fileQueueIter : uint = 0;
private var _usePngEncoder : Boolean = false;
private var _myFileRefList : FileReferenceList = new FileReferenceList();
private var _imgTypeFilter : FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png");
private var _otherTypeFilter : FileFilter = new FileFilter("Other files(*)", "*");
private var _buttonSelect : ButtonInteractivity;
//private var _URLloaderList : Array = new Array;
public function Main():void
{
stage.align = StageAlign.TOP_LEFT;
stage.scaleMode = StageScaleMode.NO_SCALE;
Security.allowDomain("*");
if (stage) {
initParams( );
initDisplay( );
init( );
}
else addEventListener(Event.ADDED_TO_STAGE, init);
}
private function initParams ( ) : void
{
var paramObj:Object = LoaderInfo(this.root.loaderInfo).parameters;
if (paramObj.hasOwnProperty('max_width'))
_MAX_WIDTH = paramObj['max_width'];
if (paramObj.hasOwnProperty('max_height'))
_MAX_HEIGHT = paramObj['max_height'];
if (paramObj.hasOwnProperty('path'))
_loaderURL = paramObj['path'];
if (paramObj.hasOwnProperty('buttonSelectText'))
_buttonSelectText = paramObj['buttonSelectText'];
if (paramObj.hasOwnProperty('getParamsString'))
_getParams = paramObj['getParamsString'];
if (paramObj.hasOwnProperty('usePngEncoder'))
{
if (paramObj['usePngEncoder'] == "true")
_usePngEncoder = true;
else
_usePngEncoder = false;
}
//_getParams = "name=testname,id=2223";
if (_getParams != null && _getParams != "")
{
var results:Array = _getParams.split(",");
_getParams = "";
for (var i:uint = 0; i < results.length; i++)
{
_getParams += "&" + results
;
}
}
}
public function initDisplay() : void
{
_buttonSelect = new ButtonInteractivity();
_buttonSelect.setText( _buttonSelectText );
addChild( _buttonSelect );
}
private function init(e:Event = null):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
// entry point
//if (ExternalInterface.available)
//{
//ExternalInterface.addCallback("JSselectFile", showJSErrorMessage);
//}
_buttonSelect.addEventListener( MouseEvent.CLICK, showWindowSelectFile );
}
private function showWindowSelectFile(event:Event):void
{
_myFileRefList.addEventListener ( Event.SELECT, fileListSelected );
//! не работает в браузере через JavaScript
_myFileRefList.browse( [_imgTypeFilter, _otherTypeFilter] );
}
private function fileListSelected(event:Event):void
{
var file:FileReference;
var files:FileReferenceList = FileReferenceList(event.target);
var selectedFileArray:Array = files.fileList;
_fileQueue = selectedFileArray.length;
for (var i:uint = 0; i < selectedFileArray.length; i++)
{//! нужно запускать загрузку следующего файла по завершении загрузки текущего
file = FileReference(selectedFileArray);
file.addEventListener(Event.COMPLETE, fileLoaded);
file.load ( );
}
}
private function fileLoaded( event:Event ):void
{
var tempFileRef : FileReference = FileReference ( event.target );
JSfileSelected(tempFileRef.name);
if ( _imgTypeFilter.description.indexOf(tempFileRef.type) > 0 )
{// images
var loader:Loader = new Loader ( ) ;
loader.name = tempFileRef.name;
loader.contentLoaderInfo.addEventListener ( Event.COMPLETE, sendImage );
loader.loadBytes ( tempFileRef.data ) ;
}
else
{// other files
loadFileToServer(tempFileRef.data, tempFileRef.name);
}
}
private function sendImage(event:Event):void
{
var bitmap:Bitmap = Bitmap ( event.target.content );
bitmap.smoothing = true;
if ( bitmap.width > _MAX_WIDTH || bitmap.height > _MAX_HEIGHT )
resizeBitmap ( bitmap );
addChild ( bitmap );
var jpgSource:BitmapData = new BitmapData ( bitmap.width, bitmap.height );
jpgSource.draw(this);
removeChild( bitmap );
var imageStream:ByteArray;
if (String(event.currentTarget.loader.name).indexOf("png") > 0 && _usePngEncoder)
imageStream = by.blooddy.crypto.image.PNG24Encoder.encode( jpgSource );
else
imageStream = by.blooddy.crypto.image.JPEGEncoder.encode( jpgSource );
loadFileToServer(imageStream, event.currentTarget.loader.name);
}
private function loadFileToServer( fileStream:ByteArray, filename:String ):void
{
var header:URLRequestHeader = new URLRequestHeader( "Content-type", "application/octet-stream" );
var fileURLRequest:URLRequest = new URLRequest( _loaderURL + "?filename=" + filename + _getParams );
var URLloader:URLLoader = new URLLoader();
//_URLloaderList.push(URLloader);
URLloader.addEventListener( Event.COMPLETE, completeHandler );
URLloader.addEventListener( Event.OPEN, openHandler );
URLloader.addEventListener( ProgressEvent.PROGRESS, progressHandler );
//URLloader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityErrorHandler);
//URLloader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
URLloader.addEventListener(IOErrorEvent.IO_ERROR, errorSendFile);
fileURLRequest.requestHeaders.push(header);
fileURLRequest.method = URLRequestMethod.POST;
fileURLRequest.data = fileStream;
//loader.addEventListener ( ProgressEvent.PROGRESS, progressHandler ) ;
//navigateToURL(jpgURLRequest, "_blank");
URLloader.load( fileURLRequest );
}
private function completeHandler( event:Event ):void
{
var loader:URLLoader = URLLoader(event.target);
//trace("Answer from server: " + loader.data);
JSfileLoadComplete( loader.data );
//! если ответ не возможно будет парсить, будет вызвано исключение
//var vars:URLVariables = new URLVariables(loader.data);
//trace("The answer is " + vars.answer);
}
private function openHandler( event:Event ):void
{
JSopenURLRequst(event.toString());
}
private function progressHandler( event:ProgressEvent ):void
{
JSsendingFileProgress(event.bytesLoaded, event.bytesTotal);
}
private function errorSendFile(event:IOErrorEvent):void
{
// Unable to load requested document.
showJSErrorMessage("Can not send file." + event);
}
private function resizeBitmap( target:Bitmap ) : void
{
if ( target.height > target.width ) {
target.width = _MAX_WIDTH;
target.scaleY = target.scaleX;
} else if ( target.width >= target.height ) {
target.height = _MAX_HEIGHT;
target.scaleX = target.scaleY;
}
}
/* JavaScript API functions */
private function showJSErrorMessage( msg:String = null ):void
{
trace(msg);
if (ExternalInterface.available)
/*var result:uint = */ExternalInterface.call( "SWFShowErrorMessage", "Error message: " + msg );
}
private function JSfileSelected( name:String ):void
{
trace( "File Selected and loaded" + name );
if (ExternalInterface.available)
ExternalInterface.call( "SWFFileSelectedAndLoaded", name );
}
private function JSopenURLRequst(request:String):void
{
trace("connected to host: " + request);
if (ExternalInterface.available)
ExternalInterface.call( "SWFopenURLRequst", request );
}
private function JSsendingFileProgress(bytesLoaded:uint, bytesTotal:uint):void
{
trace("progressHandler loaded:" + bytesLoaded + " total: " + bytesTotal);
if (ExternalInterface.available)
ExternalInterface.call( "SWFsendigFileProgress", bytesLoaded, bytesTotal );
}
private function JSfileLoadComplete( request:String ):void
{
//for (var i:uint = 0; i < _URLloaderList.length; i++)
//{
//_URLloaderList.close() ;
//}
_fileQueueIter++;
JSAnFileLoaded();
if (_fileQueueIter == _fileQueue)
JSAllFilesLoaded();
//trace( "File sended, request is: " + request );
if (ExternalInterface.available)
ExternalInterface.call( "SWFfileLoadComplete", request );
}
private function JSAllFilesLoaded():void
{
if (ExternalInterface.available)
ExternalInterface.call( "SWFAllFilesLoaded" );
_fileQueueIter = 0;
}
private function JSAnFileLoaded():void
{
if (ExternalInterface.available)
ExternalInterface.call( "SWFAnFileLoaded", _fileQueueIter, _fileQueue);
}
}
}