| wir_wolf |
02.05.2010 15:50 |
Аплоадер фото, такой же как Вконтакте с ресайзом(не могу закончить)
Уважаемые форумчани, У меня недавно возникла проблема с загрузкой и ресайзом фото.
Сначала я сделал ресайз в пхп, но так как у меня на хостинге на 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.Надеюсь я ясно выразился, заранее большое спасибо за помощь!
|