Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   загрузка файлов через флэш на сервер (http://www.flasher.ru/forum/showthread.php?t=121340)

droch_fhoula 13.02.2009 15:48

загрузка файлов через флэш на сервер
 
как загружать файлы на сервер?
у меня есть пример на as2 а как на as3 я и понтия не имею.
пыталась переделать, но не получается.
может кто ссылку даст или подскажет как нибуть:rolleyes:

silin 13.02.2009 16:36

ниже 10й версии флеш не может сам что-то загрузить с компа юзера, может только попросить сделать это браузер, см. FileReference.upload (AS3 вариант ничем принципиально не отличается от AS2-версии)
в 10й версии может и сам загрузить (см. FileReference.load), дальше дело хозяйское - можно и серверу полученные данные оправить (см. URLLoader)

примеры в доках имеются, а в сети и подавно..

droch_fhoula 13.02.2009 17:56

Вложений: 1
я все равно е понимаю как это делается.
когда исправляю то все время разные ошибки выдаются.
посмотрите исходник плиз, как это можно переделать на as3.

Alex Lexcuk 14.02.2009 09:23

>>посмотрите исходник плиз, как это можно переделать на as3.
Не смотрел, тк. имею уже рабочую на AS3

Для тестов нужна программка Apache
Пишем для Flex или для Adobe Flash CS4 (версия плеера 10) такой документ класс
Код AS3:

//LoadCompFileDocAndSendToServer
package {
        import flash.display.*;
        import flash.text.*;
        import flash.net.*;
        import flash.events.*;
        import flash.utils.*;
 
        public class LoadCompFileDocAndSendToServer extends Sprite {
                private var loader:Loader,
                        file:FileReference,
                        txt:TextField,
                        sender:ByteArray,
                        i:int,
                        fileName:String,
                        request:URLRequest,
                        urlLoader: URLLoader,
                        strFileNoEx:String,
                        reg:RegExp;
 
 
                public function LoadCompFileDocAndSendToServer() {
                        txt=new TextField;
                        txt.autoSize=TextFieldAutoSize.LEFT;
                        file=new FileReference;
                        // file.browse(getTypes());
                        file.addEventListener(Event.COMPLETE,onComplete);
                        file.addEventListener(Event.SELECT,onSelectFile);
                        //onShowloadDialog();
                        txt.htmlText="<a href='event:load'><u>Загрузить файл c компьютера</a>;";
 
                        addChild(txt);//добавить на рабочее поле
                        txt.autoSize=TextFieldAutoSize.LEFT;
                        addChild(txt);
                        txt.addEventListener(TextEvent.LINK,txtLinkFunc);
                        urlLoader = new URLLoader();
                        urlLoader.addEventListener(Event.COMPLETE,completeHandlerUrlLoader);
                }
 
                private function txtLinkFunc(evt:TextEvent):void {
                        if (evt.text == 'load') {
                                onShowloadDialog();
                        }
                }
 
                //отображение диалога открытия файла
                private function onShowloadDialog(event:Event=null):void {
                        var fileFilter:FileFilter=new FileFilter("Images","*.jpg");
                        try {
                                file.browse([fileFilter]);
                        }
                        //catch(illegalOperation:IllegalOperationError){
                        catch (e:Error) {
                        }
                }
                //при выборе файла загружаем его
                private function onSelectFile(event:Event):void {
                        try {
                                file.load();
                        }
                        // catch(illegalOperation:IllegalOperationError)
                        catch (e:Error) {
                        }
                }
                private function onComplete(event:Event):void {
                        addChild(loader=new Loader  );
                        loader.loadBytes(file.data);
                        loader.y = 20;
 
                        //отправляем на сервер
                        reg = /\.\w+/;//регулярка вылавливающая расширение файла
                        strFileNoEx = file.name.replace(reg,'');
                        trace(strFileNoEx);//имя загруженного файла без расширения
 
                        request = new URLRequest(
                        "http://localhost/CONTENT_PATH/save-file.php?name="+strFileNoEx+"&d="+new Date().getTime());
                        request.data = file.data;
                        request.method = URLRequestMethod.POST;
                        request.contentType = 'application/octet-stream';
                        urlLoader.load(request);
 
                }
                private function completeHandlerUrlLoader(event:Event):void {
                        trace(urlLoader.data);
                        addChild(txt=new TextField);
                        txt.autoSize=TextFieldAutoSize.LEFT;
                        txt.y = 200;
                        txt.htmlText="<font color='#ff0000'  size='30'> Файл на сервере";
                }
        }
}

php скрипт принимает имя файла без расширения и добавляет расширения jpg
также понадобится php файл save-file.php

Код:

<?php
        //save-file.php
        $fileData = $GLOBALS[HTTP_RAW_POST_DATA];
        $fileName = ''.$_GET['name'].'.jpg';
        $fp = fopen($fileName, "w");
        fwrite($fp,$fileData);
        fclose($fp);
        echo "file write - OK ".$fileName;
?>


Пример как это работает (загрузите с компьютера jpg и он автоматом залетит мне на сайт)
После выбора файла пройдет некоторое время, должна появиться надпись файл на сервере.

http://www.murmadillo.tut.su/m/galle...ndToServer.swf

Посмотреть загрузился ли ваш jpg файл мне на сайт можно перейдя по ссылке

http://www.murmadillo.tut.su/m/gallery/

droch_fhoula 14.02.2009 16:06

спасибо!!! работает!!!
а как сделать так чтоб загруженные фото сразу в фото галерее отображались?

Alex Lexcuk 14.02.2009 17:40

>>а как сделать так чтоб загруженные фото сразу в фото галерее отображались?
В смысле галерейка с такими кнопочками:
[назад] [вперед] [стоп] [авто] [добавить рисунок]
А не боитесь???

droch_fhoula 14.02.2009 18:45

ну кикаких копок не нужно :)
мне нужно только чтоб это фото тут же появлялось в фотогалерее.
и его можно было бы посмотеть, и ничего больше.
нет не боюсь:) а чего боятся?

Alex Lexcuk 15.02.2009 01:08

ну так нужно галереи подсунуть php файл, который вернет jpg
типа такого
Код:

<?php
//return-picture.php
$dd=opendir(getcwd());
$my_string="";
while (true)
{
$cur=readdir($dd);
if ($cur=="") break;
if ( (strpos($cur,"jpg")==true) or (strpos($cur,"JPG")==true) )
$my_string=$my_string.$cur."|";
}
closedir($dd);
$my_string=$my_string;
echo $my_string;
?>

Загрузить его в галерею можно как-так (документ класс)
Код:

package {
        import flash.display.*; import flash.events.*; import flash.ui.*; import flash.text.*;
        import flash.net.*;import fl.transitions.*;import fl.transitions.easing.*;import flash.utils.*;

        public class DocGalery extends Sprite {
                private var loader:URLLoader,
                        pLoader:Loader,req:URLRequest,count:int,position:int,path:String,picArr:Array,
                        sp:Sprite,tween:Tween,tweenTimer:Tween,tr:Boolean,i:int,urlLoader:URLLoader,
                        prePathStr:String,allPicLoadingTr:Boolean,finalImag:int,
                        actTw:Boolean,nextPreCont:int,pattern:RegExp = /\w+\.\w+/,result:Object;

                public function DocGalery() {
                        stage.scaleMode = StageScaleMode.NO_SCALE;
                        stage.align = StageAlign.TOP_LEFT;

                        actTw = allPicLoadingTr = false;
                        nextPreCont = finalImag = 0;
                        //addChild(txt);
                        //загрузка имен файлов через php файл
                        prePathStr = "";// "http://localhost/CONTENT_PATH/gallery/";//;
                        var phpFileStr:String = "return-picture.php?"+new Date().getTime();
                        var pictURLReq:URLRequest = new URLRequest(prePathStr + phpFileStr);
                        urlLoader = new URLLoader();
                        urlLoader.dataFormat = URLLoaderDataFormat.BINARY;
                        urlLoader.addEventListener(Event.COMPLETE, urlLoaderCompleteHandler);
                        urlLoader.addEventListener(ProgressEvent.PROGRESS,progressHandler);
                        urlLoader.load(pictURLReq);
                        //GoGalery();
                }
                private function progressHandler(event:ProgressEvent):void {
                        trace(" progressHandler loaded: " + event.bytesLoaded + " total: " + event.bytesTotal);
                }

                private function urlLoaderCompleteHandler(event:Event):void {
                        var strUnSort:String = new String(urlLoader.data);
                        var pictureArr:Array = strUnSort.split("|");
                        //var correctArr:Array = [];
                        picArr = [];
                        for (i = 0; i < pictureArr.length - 1; i++) {
                                result = pattern.exec(pictureArr[i]);
                                trace(result);
                                if (result!=null) if (result.toString() == pictureArr[i]) picArr.push(pictureArr[i]);
                        }
                        trace(picArr);
                        //имена файлов загружены - запускаем галерею
                        trace(strUnSort);
                        goGalery();
                }

                private function goGalery():void {
                        path = prePathStr;
                        req = new URLRequest();
                        count = 0;
                        position = 0;

                        onward();
                        tween = new Tween( { i:0 }, "i", Regular.easeOut, 0, 1, 5, true);
                        tweenTimer = new Tween( { i:0 }, "i", Regular.easeOut, 0, 1, 5, true);
                        tween.stop();
                        tweenTimer.stop();
                        tween.addEventListener(TweenEvent.MOTION_CHANGE, tweenChange);
                        tween.addEventListener(TweenEvent.MOTION_FINISH, finTweenFunc);
                        tweenTimer.addEventListener(TweenEvent.MOTION_FINISH, finTimerFunc);
                }
                private function loaderComplete(evt:Event):void {
                        trace(req.url);
                        if (loader.bytesTotal>3000){
                                sp = new Sprite();
                                sp.graphics.beginFill(0xffffff);
                                sp.graphics.drawRect(0, 0, 1500, 800);
                                pLoader = new Loader();
                                pLoader.loadBytes(loader.data as ByteArray);
                                sp.addChild(pLoader);
                                addChild(sp);
                                sp.alpha = 0;
                                finalImag++;
                                if (actTw == false) {
                                        nextPreCont++;
                                        tween.stop();
                                        tween.start();
                                }
                                count++;
                                onward();
                        }
                        else {
                                count++;
                                onward();
                        }
                }
                private function ioErrorHandler(event:IOErrorEvent):void {
                        count++;
                        onward();
                }

                private function onward():void {
                        if (count < picArr.length) {
                                trace('Гружу');
                                loader = new URLLoader();
                                loader.dataFormat= URLLoaderDataFormat.BINARY;
                                req.url = path + picArr[count];// +'?=' + new Date().getTime();
                                trace(req.url);
                                loader.load(req);
                                loader.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
                                loader.addEventListener(ProgressEvent.PROGRESS,progressHandler);
                                loader.addEventListener(Event.COMPLETE,loaderComplete);
                        }
                        if (count == picArr.length) {
                                allPicLoadingTr = true;
                                tween.start();
                                position = nextPreCont;
                        }
                }
                private function tweenChange(evt:TweenEvent):void {
                        actTw = true;
                        if (allPicLoadingTr == true){
                                sp = this.getChildAt(position) as Sprite;
                                sp.alpha = tween.obj.i;
                        }
                        if (allPicLoadingTr == false){
                                try{sp = this.getChildAt(nextPreCont-1) as Sprite;
                                sp.alpha = tween.obj.i;}catch(e:Error){}
                        }
                }

                private function finTweenFunc(evt:TweenEvent):void {
                        tweenTimer.start();
                }

                private function finTimerFunc(event:TweenEvent):void {
                        actTw = false;
                        if (allPicLoadingTr == true){
                                position++;
                                trace("finalImag " + finalImag + " " + "position " + position);
                                if (position >= finalImag) {
                                        position = 0;
                                        for (i = 0; i < this.numChildren; i++) this.getChildAt(i).alpha = 0;
                                }
                                tween.start();
                        }
                }
        }
}

Будет работать так:
http://www.murmadillo.tut.su/m/gallery/DocGalery.swf

droch_fhoula 15.02.2009 12:19

а как сделать чтоб фото загружались каждая в отдельный контейнер и при этом выглядела как маленькая превьюшка, а именно меняла размер.
а то у меня чтото странно получается с scаleX и scaleY. фото становится громадным.
:(

loover 01.04.2009 22:46

а как правильно изменить размер в самом PHP? у меня есть код, но на выходе получается строка, а не jpeg. после добавления header("Content-type: image/jpeg"); php пишет, что заголовки уже добавлены и по-прежнему возвращает строку.

Abizan 03.04.2009 22:24

Скажите, а где пожно посмотреть все свойства класса FileReference? Например свойство data в хелпе я не нашел (оно наверно наследуется откуда-то:). Вообще мне нужно узнать полное имя выбранного файла (вместе с путем).

etc 04.04.2009 12:44

data доступно к десятой версии флеша.

Abizan 25.05.2009 20:52

Скажите, а как запустить анимацию во время загрузки файла? Какой-нибудь обычный бегунок, который бы показывал, что файлы грузятся. Нужен не прогрессбар, а простая анимашка :)
Заранее спасибо!

rty 25.05.2009 21:34

событие progress
http://help.adobe.com/ru_RU/AS3LCR/F...0.0/index.html

Abizan 25.05.2009 21:42

Когда запустить я знаю :) Я не знаю КАК запустить :)
Можно запустить gif-картинку например? и как это сделать?

Stargazer 25.05.2009 21:46

Для анимации предназначены мувиклипы, в нём вы сможете разместить гиф.
Разместите клип с анимацией на сцене - и будет "простая анимашка".

Abizan 25.05.2009 22:25

Ок, получается, что весь интерфейс остается в первом кадре. Я просто перенес картинку(гиф) мышкой в сцену(Drag&Drop). Можно как-то сделать, чтобы анимация воспроизводилась, а кнопка и текстфилды были на месте?
Прошу подробностей, я во флеше вообще нуб, только на actionscript написал аплоадер, а как с графикой работать не знаю.

Stargazer 25.05.2009 23:14

Цитата:

Можно как-то сделать, чтобы анимация воспроизводилась, а кнопка и текстфилды были на месте?
Вариант1. Сделайте один клип с анимацией. Потом вставьте его в клип с кнопками и текст филдами.
Вариант2. Сделайте разные слои. На одном слое пусть воспроизводится анимация. А на других слоях будут лежать другие элементы.

Abizan 25.05.2009 23:28

Вложений: 1
Я пробовал по второму варианту.
Получается, что интерфейс только в первом кадре отображается. Может я неправильно делаю?

Stargazer 25.05.2009 23:50

Цитата:

Сообщение от Abizan (Сообщение 823082)
Я пробовал по второму варианту.
Получается, что интерфейс только в первом кадре отображается. Может я неправильно делаю?

Ошибка в том, что у вас второй слой только из одного кадра состоит. Добавьте ещё обычных (не ключевых) кадров, чтобы количество кадров на слоях было одинаковым.

P.S. Ещё аккуратнее со скриптами, написанными в кадрах. Если анимация играется несколько раз - то каждый раз при наступлении кадра скрипт будет выполняться.

Abizan 26.05.2009 13:00

Спасибо большое :)

morgenshtern 27.05.2009 17:23

Дабы не плодить похожие темы спрошу здесь.

Сохраняю картинки из флешки на сервере. Флеша шлет пнгшки, пожатые PNGEncoder-ом, пхп сохраняет. Планируется, что в итоге будет около сотни картинок, размером до 350*350 (не больше), которые нужно будет сохранить на серве.

Такой вопрос, какой вариант выгоднее, в плане производительности и скорости:
1. Сначала пережать все картинки во флеше, потом, последовательно, с подтверждением получения, послать на серв.
2. Пожали картинку, послали, получили ответ, пожали и послали другую.


Интересно ваше мнение.

GBee 27.05.2009 17:36

А что сказали тесты?

morgenshtern 27.05.2009 17:42

Это дело пока в голове. Думаю, какой из вариантов реализовать.

Параллельно еще пара вопросов.
1. Можно ли повесить на URLLoader событие DataEvent.UPLOAD_COMPLETE_DATA? Т.е. хочу прочесть, то что пхп ответил. На FileReference работает, на URLLoader нет. Невозможно?
Ответ от пхп приходит в event.target.data по Event.COMPLETE. Выходит комплит вызывается при получении ответа от серва? Я полагал, что по завершению отгрузки.
2. Пожатые PNGEncoder-ом картинки получаются в среднем в 20 раз больше оригинала. А лучше не становятся ) Как побороть?

Добавлено через 4 часа 22 минуты
Короче протестил сохранение. Примерно одинаково получилось. Даже 2й вариант немного быстрее на пол секунды (15 одинаковых тестовых картинок). Само сжатие в 1м варианте занимало от 500 до 1,5к мс, в зависимости от набора картинок.
Думаю 2й более приемлем, т.к. не храним массив из кучи ByteArray.

NARKOZ 30.07.2009 00:41

Цитата:

Сообщение от loover (Сообщение 810120)
а как правильно изменить размер в самом PHP? у меня есть код, но на выходе получается строка, а не jpeg. после добавления header("Content-type: image/jpeg"); php пишет, что заголовки уже добавлены и по-прежнему возвращает строку.

Для этого хеадер нужно разместить в самое начало php скрипта, после <?php

loover 09.08.2009 22:42

morgenshtern, а как вы читаете ответ сервера при FileReference.upload()?

Alex Lexcuk 09.08.2009 23:58

>>morgenshtern, а как вы читаете ответ сервера при FileReference.upload()?

надо к FileReference прицепить листенер Event.Complete, а сервера - никак.

aristotle 20.01.2010 20:17

Alex Lexcuk, очень познавательно, но хотелось бы узнать какие есть ограничения на размер загружаемого файла и от чего эти ограничения зависят. Мне нужно с помощью флеша передать на сервер файл размером в 1Гиг.
P.s.: приведенный в 4-м сообщениии пример справился с 5Mb, но 50Mb не осилил.

Alex Lexcuk 21.01.2010 11:07

Цитата:

Сообщение от aristotle (Сообщение 880714)
Alex Lexcuk, очень познавательно, но хотелось бы узнать какие есть ограничения на размер загружаемого файла и от чего эти ограничения зависят. Мне нужно с помощью флеша передать на сервер файл размером в 1Гиг.
P.s.: приведенный в 4-м сообщениии пример справился с 5Mb, но 50Mb не осилил.

а вы чего хотели от бесплатного белорусского хостинга, работает и то уже хорошо.

leofit 21.01.2010 11:21

По умолчанию PHP разрешает загрузку файлов до 2 Мб, обычно расширяют до 8 Мб.
Что бы поменять это число надо либо править php.ini либо прописать в .htaccess соответствующее правило.
Но если у Вас бесплатный хостинг то увы Вам

aristotle 21.01.2010 13:41

Уточню что при загрузке картинки в 50Mb возникала следущая ошибка actionscript:
Цитата:

Error #2044: Необработанный ioError:. text=Error #2032: Ошибка потока. URL: httр://www.murmadillo.tut.su/m/gallery/save-file.php?name=xcvcv&d=1264065896828
at LoadCompFileDocAndSendToServer()[D:\FLEX\LoadCompFileDocAndSendToServer.as:38]
Я уже было подумал, что флеш просто запрещает загружать в себя большие файлы. тем более нашел в документации следущее
Цитата:

public function load():void

Язык версии : ActionScript 3.0
Версии среды выполнения: 10, 1.5

Начинает загрузку локального файла, выбранного пользователем. Несмотря на то, что Flash Player не имеет ограничений на размер отправляемых, загружаемых или сохраняемых файлов, официально проигрыватель поддерживает обработку информации, объем которой не превышает 100 МБ. Перед тем как вызвать данный метод, следует вызвать метод FileReference.browse() или FileReferenceList.browse().
Но потом решил проверить сам. Убрал из приведенного тут примера вывод изображения и отсылку на сервер. В итоге во флеш удалось загрузить файл размером 120MB. Попробую теперь разбить полученые данные и передавать их на сервер частями. Жалко что по событию Progress нельзя постепенно отсылать эти данные, т.к. свойство data доступно только после полной загрузки

rispekt 27.09.2010 05:40

Alex Lexcuk, Спасибо за код!

Тимур 04.11.2010 15:58

О, какая хорошая тема...
Alex Lexcuk, А как изображение, которое заносится записать в бд? и что будет, если в вашем случае имена изображений будут одинаковые?

Alex Lexcuk 04.11.2010 17:03

Цитата:

Сообщение от Тимур (Сообщение 947607)
О, какая хорошая тема...
Alex Lexcuk, А как изображение, которое заносится записать в бд? и что будет, если в вашем случае имена изображений будут одинаковые?

В бд не шарю, если имена будут одинаковые и если вам лень попробовать, а я и так знаю, что файл будет перезаписан.

Тимур 06.11.2010 14:17

спасибо...полезная статья...

fifa_sibir 07.04.2012 18:59

Alex Lexcuk, Огромное спасибо за ваш пример! давно искала:)
только один вопрос: как можно поменять директорию?

Alex Lexcuk 07.04.2012 19:25

Цитата:

Сообщение от fifa_sibir (Сообщение 1073621)
Alex Lexcuk, Огромное спасибо за ваш пример! давно искала:)
только один вопрос: как можно поменять директорию?

Самый простой путь, это php скрипт, который принимает данные залить в другую директорию.


Часовой пояс GMT +4, время: 23:17.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.