Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.08.2009, 08:48
Ляксей вне форума Посмотреть профиль Отправить личное сообщение для Ляксей Найти все сообщения от Ляксей
  № 1  
Ответить с цитированием
Ляксей

Регистрация: Nov 2006
Сообщений: 93
По умолчанию Загрузка файла на сервер и прогресс бар. Как?

Есть у нас проект 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);
__________________
Flash Menu Labs - русская версия

Старый 27.08.2009, 08:59
kackbip вне форума Посмотреть профиль Отправить личное сообщение для kackbip Найти все сообщения от kackbip
  № 2  
Ответить с цитированием
kackbip
 
Аватар для kackbip

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

Старый 27.08.2009, 09:21
Ляксей вне форума Посмотреть профиль Отправить личное сообщение для Ляксей Найти все сообщения от Ляксей
  № 3  
Ответить с цитированием
Ляксей

Регистрация: Nov 2006
Сообщений: 93
Цитата:
Сообщение от kackbip Посмотреть сообщение
Первый вариант. ...
---
Второй вариант, это серверный скрипт, который бы возвращал текущий прогресс аплоада(как это сделано на яндекс видео). Нужно будет в процессе аплоада периодически спрашивать у него о прогрессе.
Как я понимаю первый вариант для флеша ничем кардинально не отличается от отсылки с помощью URLLoader, который используем мы, так что боюсь что тоже не вызовется ProgressEvent.PROGRESS.

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

Старый 27.08.2009, 09:30
kackbip вне форума Посмотреть профиль Отправить личное сообщение для kackbip Найти все сообщения от kackbip
  № 4  
Ответить с цитированием
kackbip
 
Аватар для kackbip

Регистрация: Sep 2007
Адрес: Tomsk
Сообщений: 943
Отправить сообщение для kackbip с помощью ICQ Отправить сообщение для kackbip с помощью Skype™
Вообще-то из хелпа можно понять, что URLLoader не генерирует ProgressEvent при аплоаде данных на сервер, а FileReference генерирует. Так что не оказывайтесь так быстро он нормальных нечерезпопных методов Вы проверьте и отпишитесь потом - мне тоже полезно будет знать. Первый вариант предпочтительней.

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

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


Последний раз редактировалось kackbip; 27.08.2009 в 09:32.
Старый 27.08.2009, 11:25
Ляксей вне форума Посмотреть профиль Отправить личное сообщение для Ляксей Найти все сообщения от Ляксей
  № 5  
Ответить с цитированием
Ляксей

Регистрация: Nov 2006
Сообщений: 93
Цитата:
Сообщение от kackbip Посмотреть сообщение
...Вы проверьте и отпишитесь потом - мне тоже полезно будет знать...
Спасибо, событие прогресса действительно вызывается. Но вызвать 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. Почему вы думаете, что они используют скрипты?
__________________
Flash Menu Labs - русская версия


Последний раз редактировалось Ляксей; 27.08.2009 в 12:08.
Старый 27.08.2009, 13:44
kackbip вне форума Посмотреть профиль Отправить личное сообщение для kackbip Найти все сообщения от kackbip
  № 6  
Ответить с цитированием
kackbip
 
Аватар для kackbip

Регистрация: Sep 2007
Адрес: Tomsk
Сообщений: 943
Отправить сообщение для kackbip с помощью ICQ Отправить сообщение для kackbip с помощью Skype™
Цитата:
Но вызвать 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


Последний раз редактировалось kackbip; 27.08.2009 в 13:53.
Старый 24.09.2011, 22:10
beatstream вне форума Посмотреть профиль Отправить личное сообщение для beatstream Найти все сообщения от beatstream
  № 7  
Ответить с цитированием
beatstream

Регистрация: Jan 2009
Сообщений: 7
Question null

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

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

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

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

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


Последний раз редактировалось beatstream; 03.10.2011 в 21:53.
Старый 25.09.2011, 16:06
kackbip вне форума Посмотреть профиль Отправить личное сообщение для kackbip Найти все сообщения от kackbip
  № 8  
Ответить с цитированием
kackbip
 
Аватар для kackbip

Регистрация: Sep 2007
Адрес: Tomsk
Сообщений: 943
Отправить сообщение для kackbip с помощью ICQ Отправить сообщение для kackbip с помощью Skype™
Цитата:
И еще - fileReference мне не совсем подходит, потому что после загрузки данных не возвращает ответ. А надо бы.
Неправдад ваша. Но все равно это не поможет получить прогресс аплоада, если вам надо измененный файл отправить. JS тоже не позволит прогресс загрузки отслеживать. Разве что java аплоадер сделать, но это тоже имеет свои недостатки.

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


Последний раз редактировалось kackbip; 25.09.2011 в 16:10.
Старый 15.08.2012, 01:02
beatstream вне форума Посмотреть профиль Отправить личное сообщение для beatstream Найти все сообщения от beatstream
  № 9  
Ответить с цитированием
beatstream

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

Старый 15.08.2012, 07:33
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 10  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
А если картинка огромная? Это не только лишний расход ресурсов, но и трафика на загрузку. Это не принципиально?

Создать новую тему Ответ Часовой пояс GMT +4, время: 03:13.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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