Форум 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=129214)

Ляксей 27.08.2009 08:48

Загрузка файла на сервер и прогресс бар. Как?
 
Есть у нас проект Q-ImageUploader, который отсылает картинки на сервер, предварительно сделав с ними некоторые манипуляции (resize,rotate). Проблема в том, что когда мы их отсылаем методом POST флеш не вызывает событие ProgressEvent.PROGRESS. И в итоге у нас нет прогрессбара.
Как можно с этим побороться?
Может как-то на стороне сервера какой специальный скрипт?
Может кто-то готов решить эту проблему за деньги?

Добавлено через 8 минут
Код AS3:

 var urlRequest:URLRequest = new URLRequest();
urlRequest.data=this._postdata.getPostData();
urlRequest.url=global.urlToUpload;
urlRequest.contentType="multipart/form-data; boundary="+_postdata.getBoundary();
urlRequest.method=URLRequestMethod.POST;
urlRequest.requestHeaders.push(new URLRequestHeader("Cache-Control", "no-cache"));
//
upLoader = new URLLoader();
//
upLoader.dataFormat=URLLoaderDataFormat.BINARY;
 
// этот листенер не работает
upLoader.addEventListener(ProgressEvent.PROGRESS, progressHandler);
 
upLoader.addEventListener(HTTPStatusEvent.HTTP_STATUS, httpStatusHandler);
upLoader.addEventListener(Event.COMPLETE, imagesUploadDone);
upLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, securityError);
upLoader.addEventListener(IOErrorEvent.IO_ERROR, onIOError);


kackbip 27.08.2009 08:59

Первый вариант. Предполагаю, что вы выбираете файл на локальном диске с помощью FileReference.browse()
затем загружаете его во флэшку с помощью FileReference.load()
Значит вам доступно свойство FileReference.data
После того как вы отредактировали картинку, полученную битмапу можно записать в FileReference.data, только не так FileReference.data = byteArray, а так FileReference.data.writeBytes, а потом воспользоваться FileReference.upload, а FileReference при аплоаде генерирует событие ProgressEvent
Сам таким методом не пользовался, но может сработать.
---
Второй вариант, это серверный скрипт, который бы возвращал текущий прогресс аплоада(как это сделано на яндекс видео). Нужно будет в процессе аплоада периодически спрашивать у него о прогрессе.

Ляксей 27.08.2009 09:21

Цитата:

Сообщение от kackbip (Сообщение 846042)
Первый вариант. ...
---
Второй вариант, это серверный скрипт, который бы возвращал текущий прогресс аплоада(как это сделано на яндекс видео). Нужно будет в процессе аплоада периодически спрашивать у него о прогрессе.

Как я понимаю первый вариант для флеша ничем кардинально не отличается от отсылки с помощью URLLoader, который используем мы, так что боюсь что тоже не вызовется ProgressEvent.PROGRESS.

А можно поподробнее по поводу серверного скрипта (как в яндексе), как это организуется?

kackbip 27.08.2009 09:30

Вообще-то из хелпа можно понять, что URLLoader не генерирует ProgressEvent при аплоаде данных на сервер, а FileReference генерирует. Так что не оказывайтесь так быстро он нормальных нечерезпопных методов :) Вы проверьте и отпишитесь потом - мне тоже полезно будет знать. Первый вариант предпочтительней.

А второй вариант.. посмотирте на яндексе :) Сервис яндекс видео.

Могу на выходных взяться за деньги реализовывать первый вариант. Если не получится то деньги не возьму ;) А если получится, то возьму 50 баксиков :) В воскресенье результат теста сообщу. С серверным скриптом не помогу.

Ляксей 27.08.2009 11:25

Цитата:

Сообщение от kackbip (Сообщение 846045)
...Вы проверьте и отпишитесь потом - мне тоже полезно будет знать...

Спасибо, событие прогресса действительно вызывается. Но вызвать writeBytes не получается, так как file.data == null
Я , кстати, не нашёл описания этого поля в хелпе для FileReference
Код AS3:

private function selectHandler(event:Event):void {                        
            var file:FileReference = FileReference(event.target);
            trace("selectHandler: name=" + file.name + " URL=" + uploadURL.url);       
            file.data.writeBytes(this._postdata.getPostData(),0,this._postdata.getPostData().length);
            file.upload(uploadURL);
        }

Даже если бы этот метод и сработал, то он всё равно не подходит, так как мы посылаем ещё кучу всякой информации в _postdata - это созданные thumbnails, названия альбомов и тп, а их засовывать в файл "picture.jpg" как-то некузяво.

Посмотрел я яндекс видео и яндекс фото и видео. Поскольку они ничего на стороне клиента не делают, то спокойно могут отсылать с помощью FileReference или FileReferenceList. Почему вы думаете, что они используют скрипты?

kackbip 27.08.2009 13:44

Цитата:

Но вызвать writeBytes не получается, так как file.data
это поле будет доступно только после выполнения file.load()

Цитата:

Я , кстати, не нашёл описания этого поля в хелпе для FileReference
потому-что вы смотрите хелп не для последней версии флэша
http://help.adobe.com/en_US/AS3LCR/F...0.0/index.html

Цитата:

Даже если бы этот метод и сработал, то он всё равно не подходит, так как мы посылаем ещё кучу всякой информации
FileReference.upload позволяет отправлять кучу информации вместе с файлом. Обычный multipart http request

Цитата:

Почему вы думаете, что они используют скрипты?
Я смотрел хттп снифером - HTTPAnalyzer называется

Давайте я уже просто сделаю для вас это :)
скайп - kackbip666

beatstream 24.09.2011 22:10

null
 
fileReference.data.writeBytes() не приводит ни к чему, поскольку fileReference.data это read-only массив.
видимо, data просто унаследовал набор функций от ByteArray.

еще предложения? как это вообще обычно реализуют, через flash+js? а js позволяет считать переданные байты? Опрашивать сервер вообще не вариант - я загружаю один-два метра, и просто нецелесообразно возиться с серверной обратной связью.

хотел сокетами загружать файлы, уже все написал и работает (долго мучался с правильной сборкой заголовков), но оказалось, что сокет все равно не выкидывает ProgressEvent при аплоаде файлов. К тому же для сокетов, оказывается, нужны особые уличные файлы политики безопасности, для чего надо повесить сервер на порт 843 и все время слушать, не придет ли волшебный request. Вот такой фейл. Ну не разрешают мне на виртуальном хостинге вешать демоны.

И еще - fileReference мне не совсем подходит, потому что после загрузки данных не возвращает ответ. А надо бы.
Ну и измененный файл не отправишь.

зы: походу мне нужен свой собственный флеш с блекджеком и шлюхами, и не черезжопу не получится)

kackbip 25.09.2011 16:06

Цитата:

И еще - fileReference мне не совсем подходит, потому что после загрузки данных не возвращает ответ. А надо бы.
Неправдад ваша. Но все равно это не поможет получить прогресс аплоада, если вам надо измененный файл отправить. JS тоже не позволит прогресс загрузки отслеживать. Разве что java аплоадер сделать, но это тоже имеет свои недостатки.

Есть еще такой не очень красивый вариант - разбить отправляемый файл на несколько частей и грузить части последовательно :) Будут, конечно, задержки между окончанием загрузки очередного блока и началом загрузки следующего, но этого можно избежать, если грузить в 2 потока.

beatstream 15.08.2012 01:02

В итоге я забил и сделал проще. Обработкой изображения теперь занимается сервер. Неохота было лишний раз его грузить - у меня лимит на использование процессора и памяти). С другой стороны, на php кода для нужной операции в пару раз меньше (слава GD).
Теперь fileReferenc`ом выбираешь картинку, грузишь на сервер (с прогрессбаром, как надо :)) и даже получаешь ответ с сервера (у меня возвращается адрес картинки (или ошибка), чтобы js ее тут же вставлял на страницу). Эффект достигнут.

caseyryan 15.08.2012 07:33

А если картинка огромная? Это не только лишний расход ресурсов, но и трафика на загрузку. Это не принципиально?


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

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