Показать сообщение отдельно
Старый 02.05.2010, 15:50
wir_wolf вне форума Посмотреть профиль Отправить личное сообщение для wir_wolf Найти все сообщения от wir_wolf
  № 1  
Ответить с цитированием
wir_wolf

Регистрация: May 2010
Сообщений: 17
Attention Аплоадер фото, такой же как Вконтакте с ресайзом(не могу закончить)

Уважаемые форумчани, У меня недавно возникла проблема с загрузкой и ресайзом фото.
Сначала я сделал ресайз в пхп, но так как у меня на хостинге на 1 выполнение скрипта отведено 25 мб, мне пришлось отойти от этой идеи, так как после декомпрессии фото будет занимать длинна * ширина * 4 байта. Если фото размером 2100 на 3200 декомпрессить то получиться 26880000 байт, а это уже превышает допустимый размер, и это не придел.
Я решил делать аплоадер на сервер во флексе и чтобы там ресайз в клиенте.
Нашел хороший урок тут
взял декомпилил аплоадер который вконтакте, тем самым получив класс ресайза, но вот в чем вся проблема, я не могу из типа FileRefrens получить тип BitmapData. С кучей людей переговорил, и так и не смог сделать, вот мои исходники.
Код:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application 
	xmlns:mx="http://www.adobe.com/2006/mxml" 
	layout="absolute" 
	width="540" height="465" 
	initialize="init()" viewSourceURL="srcview/index.html">
	
	

<mx:Script>
	<![CDATA[
		import mx.events.CollectionEvent;
		import flash.net.FileReferenceList;
		import mx.collections.ArrayCollection;
		import imgEdit;
		[Bindable]
		public var imgClass:imgEdit = new imgEdit();
		public var _imgClass:imgEdit;		


		public var photos:ArrayCollection = new ArrayCollection;	
		public var Array_photo:ArrayCollection = new ArrayCollection;
		private var frList:FileReferenceList = new FileReferenceList;
		
		private var _loader:Loader;
		private var _bitmap:Bitmap;
		private var _browseTxt:*;



		private function init():void
		{
	
			photos.addEventListener(CollectionEvent.COLLECTION_CHANGE,function():void
			{ 
				startUploadButton.enabled = (photos.length>0);
				clearPhotosButton.enabled = (photos.length>0);
			});
			frList.addEventListener(Event.SELECT,addPhotos);
		}		

		private function selectPhotos():void
		{
			var fileFilter:FileFilter = new FileFilter("Изображения jpeg","*.jpg;*.jpeg");
			frList.browse([fileFilter]);
		}

		private function addPhotos(e:Event):void
		{
			for (var i:uint = 0; i < frList.fileList.length; i++)
			{
				var elem:Object = new Object;
				elem.fr = FileReference(frList.fileList[i]);
				elem.fr.load();
				elem.fr.addEventListener(Event.COMPLETE,refreshThumb);
				photos.addItem(elem);

			}
		}
		
		private function refreshThumb(e:Event):void
		{
			photosList.invalidateList();
		}

		private function clearPhotos():void
		{
			photos.removeAll();
		}
		
		public function clearPhoto(data:Object):void
		{
			photos.removeItemAt(photos.getItemIndex(data));
		}




		private function startUpload():void
		{
			for (var i:int = 0; i < photos.length; i++)
			{
				var file:FileReference = FileReference(photos.getItemAt(i).fr);
				main(file);
			}
			
			photosProgressContainer.visible = true;
			var request:URLRequest = new URLRequest();
			request.url = "upload.php";
			var fr:FileReference = photos.getItemAt(0).fr;
			fr.cancel();
			fr.addEventListener(ProgressEvent.PROGRESS,uploadProgress);
			fr.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA,uploadComplete);
			fr.upload(request);
		}



 public function main(data:FileReference):void {
 	var   file:FileReference;
  file = FileReference(data);
 // stage.addEventListener(MouseEvent.CLICK, init);
           file.addEventListener(Event.SELECT, frSelectHandler);
           file.addEventListener(Event.COMPLETE, frCompleteHandler);
             trace('----');
 }

 private function frSelectHandler(e:Event):void {
  e.target.load();
 }
 //
 private function frCompleteHandler(e:Event):void {
  var ldr:Loader=new Loader();
  ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, pictureComplete);
  ldr.loadBytes(e.target.data);
 }
 //
 private function pictureComplete(e:Event):void {
  var ldr:Loader = Loader(e.target.loader);
  trace(ldr.width, 'x', ldr.height);
  addChild(ldr);
 }

		
		
		
		private function uploadProgress(e:ProgressEvent):void
		{
			photosProgress.setProgress(e.bytesLoaded,e.bytesTotal);
		}

		private function uploadComplete(e:DataEvent):void
		{
			photos.removeItemAt(0);
			if (photos.length > 0) 
				startUpload();
			else
				photosProgressContainer.visible = false;
		}
		
		private function cancelUpload():void
		{
			photos.getItemAt(0).fr.cancel();
			photosProgressContainer.visible = false;
		}
	]]>
</mx:Script>

<mx:Panel 
	title="Загрузка фотографий" 
	paddingTop="10" paddingLeft="10" paddingBottom="10" paddingRight="10" 
	width="100%" height="100%">

	<mx:TileList
		id="photosList"
		dataProvider="{photos}"
		itemRenderer="photoThumb"
		alternatingItemColors="[#FFFFFF]" 
		verticalScrollPolicy="on"
		columnWidth="120" columnCount="4" rowHeight="110" rowCount="3" 
		itemClick="{photosList.selectedIndex=-1}" />

	<mx:HBox id="photosProgressContainer" horizontalAlign="center" width="100%" visible="false">
		<mx:ProgressBar id="photosProgress" mode="manual" label="" />
		<mx:Button label="Отмена" click="cancelUpload()"  enabled="false"/>
	</mx:HBox>
		
	<mx:ControlBar horizontalAlign="center">
		<mx:Button id="selectPhotosButton" label="Выбрать фотографии" click="selectPhotos()" />
		<mx:Button id="startUploadButton" label="Начать загрузку" click="startUpload()"  enabled="false"/>
		<mx:Button id="clearPhotosButton" label="Очистить" click="clearPhotos()"  visible="true" enabled="false"/>
	</mx:ControlBar>
</mx:Panel>
</mx:Application>
В чем у меня проблема тнад этим кодом сижу уже примерно месяц, помогите пожалуйста.
PS.Надеюсь я ясно выразился, заранее большое спасибо за помощь!


Последний раз редактировалось wir_wolf; 02.05.2010 в 16:17.