PDA

Просмотр полной версии : тонкости FileReference


bbexp
14.07.2006, 19:15
Сделал я стало быть флешку. Oна должна аплоадить файл на сервер и показывать прогресс.
Тестим - по идее все грузится как положено. Прогресс показывает, вложил дебаг.текстовое Поле чтобы смотреть как килобайты идут - то же все ок, все в соответствии с кодом.

НО. По концу загрузки onComplete вроде как срабатывает не сразу, а после серьезной такой паузы (секунд 10).

Не пойму абсолютно в чем причина.

Кто знает механику проесса?
Естественно на серваке есть пхп скрипт, который принимает файл, иначе бы онКомплит вообще бы не возникало.

bbexp
14.07.2006, 20:25
с флешкой все ок оказалось.
Существуют проблемы имено на стороне сервера.
Причем странно - я тестирую - все отлично работает, на "принимающей" стороне - тестируют - проблемы продолжаются

Так что вопрос уходит в теоретический план:
кому что известно о механике процесса, кто пользовал ФайлРеференс, какие тонкости замечены?

sem1313
07.12.2006, 02:28
Работаю с FileReference на Macintosh.

У bbexp была пауза, после загрузки файла на сервер. А у меня вообще не срабатывает onComplete.

Тот же самый риторический вопрос - почему?

Главное на PC все работает, а на Mac'е нет. Процесс аплоада отображается верно, т.е. проценты тикают, и там(PC), и там(Mac)

sem1313
07.12.2006, 09:03
Походу ни у кого Mac'ов нет...

И это правильно. Я уже с ним закалупался...

Может кто хоть теоретически представляет в чем может трабла?

vic_
07.12.2006, 11:20
я на винде, но заказчик тестит и под мак, все нормально работает, были только траблы с определением типа файла для jpeg, запутался с этим macType:"JPEG", плюнул и вытаскиваю парсингом строки из имени файла.
Может у вас с серверной частью проблемы.

etc
07.12.2006, 11:26
Ну раз проценты тикают, на сотом и завершишь работу =)
Вообще, под макосью я такие эксперименты не ставил, но можно будет попробовать…

sem1313
07.12.2006, 12:01
я на винде, но заказчик тестит и под мак


В том то и дело, что заказчик тестит под все подряд, и под Mac тоже.

Еще что интерсено, если прописать все параметры что в help'е есть, то появляется сообщение onSecurityError. Хотя на PC такого нет, все норм.



listener.onHTTPError = function(file:FileReference):Void {
trace("onHTTPError: " + file.name);
}

listener.onIOError = function(file:FileReference):Void {
trace("onIOError: " + file.name);
}

listener.onSecurityError = function(file:FileReference, errorString:String):Void {
trace("onSecurityError: " + file.name + " errorString: " + errorString);
}

sem1313
07.12.2006, 12:07
Ну раз проценты тикают, на сотом и завершишь работу =)


Ну, _etc, а не через какое ли, это место(?)

Раз есть событие onComplete, то наверняка оно должно выполнятся. При чем под любой системой. Если в Flash, это все интегрированно...

Я конечно могу сделать проверку в onProgress, на 1, но согласись это не совсем корректно будет. И не факт, что это поможет, так как я понимаю 100% - это не Init(по примеру в MovieClipLoader)...

sem1313
07.12.2006, 12:09
vic, можешь сюда запостить кусок скрипта, который отвечает за select и onComplete?

sem1313
07.12.2006, 12:31
_etc у тебя Mac?

Если да, то попробуй аплоад...

Если нет, то можно и не отвечать.

Мне нужны советы, тех кто пользовал на маке флешку, именно в том контексте, который мне нужен.

etc
07.12.2006, 13:51
sem1313, сваяй пример, я попробую.

А чем тебя проценты не устраивают? Дошло до ста — подожди секунду и считай onComplete :)
Скорее всего проблема в сервере, а не во Flash, гадать на кофейной гуще можно долго и упорно.

sem1313
07.12.2006, 13:56
Скорее всего проблема в сервере

В том то и дело, что PC реагирует/исполняет все необхожимые действия вовремя и исправно, а вот Mac, при том же коде просто не получает события onComplete...

Я уже не знаю что думать.

sem1313
07.12.2006, 14:23
У меня заказчик тоже шарит во Flash. Он говорит, что при использовании

list_obj.onSelect = function() {
file_fr.upload("http://ihousedesign.com/cms/upload_image.php");
fld = "?folder="+dataFolder;
img = "&file_name="+file.name;

fileRef.upload(url+fld+img);
};


такого кода, все работает на любой системе.

Но меня удивляет другое, как php скрипт может два раза вызваться и не ошибиться.

В общем у меня каша в голове....

etc
07.12.2006, 14:26
sem1313, тогда проблема ещё будет в браузере — заливкой, в принципе, занимается браузер и сообщает флешу о результатах.

sem1313
07.12.2006, 14:28
При аплоаде, мне в хвосте нужно передать несколько переменных - 1)Место назначения(папка куда фотка должна упасть); 2) Имя самой фотки.

Дело не в перменных или именах, а в том, что если передавать ЛЮБЫЕ перменные в хвосте функции upload, то в случае с Macintosh, ни че не срабатывает. Зато если передавать только АБСОЛЮТНЫЙ путь к скрипту php, то все работает...

sem1313
07.12.2006, 14:31
Поправлюсь.

Если передаватьТОЛЬКО абсолютный путь

sem1313
07.12.2006, 14:33
_etc, ты не туда рулишь(или я не догоняю о чем ты). Дело в onComplete

sem1313
07.12.2006, 14:34
Или ты о задержке?

etc
07.12.2006, 14:35
onComplete браузер может не передать.

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

sem1313
07.12.2006, 14:40
Мне заказчик(доброй души человек) предоставил код, который по его мнению работает везде(хоть на PC, хоть на Mace). Ну так там единственное(принципиальное) различие с моим кодом состоит в названиях объектов:FileReference...

И самое главное, что это работает.

Еще одна особенность, что при аплоаде указывается абсолютный адрес до скрипта... - http://www.upload.com/upload_image.php...

Но это тольео для Mac, для PC, можно указывать относительный.

В общем короче, я запарился... Пойду куплю пива...

sem1313
07.12.2006, 14:50
_etc, спасибо. Ты действительно можешь знать о том о чем не знаешь(в лучшем смысле)...

Просто, дело в том. Объясню популярнее... Если сделать ПРОСТО выбор, и не передавать затем PHP скрипту какие либо праметры, то все работает на УРА. И в PC, и в Mac. Но если попытатся передать в хвосте "?photo = "+makaka.jpg+"&folder = "+folderData; то PC все КОРРЕКТНО передает, а вот Mac... извините... обкекался...

etc
07.12.2006, 14:56
_etc, спасибо. Ты действительно можешь знать о том о чем не знаешь(в лучшем смысле)
Не понял :)

Я же предложил — слать сначала запрос, чтобы на сервере сохранилось имя рабочей папки (или какие-либо другие параметры), а потом уже аплоадить файл по абсолютному пути, а параметры брать, скажем, из сессии.

sem1313
07.12.2006, 15:03
У меня сложился другой путь

Сначала делаю аплоад. Который работает и на PC, и на Mac. По умолчанию делается директория - data/ (например). Потом из этой директории(а следом идет другой php-скрипт, который ресайзит фотку и пихает по нужным папкам). Так можно, и наверно полезно... Но почему onComplete не срабатывает на Mac'е... - это самый интересный вопрос...

etc
07.12.2006, 15:05
Но почему onComplete не срабатывает на Mac'е... - это самый интересный вопрос...
Понятия не имею, примера я не увидел, а экспериментировать и писать скрипты — некогда.

sem1313
07.12.2006, 15:08
Я же предложил — слать сначала запрос, чтобы на сервере сохранилось имя рабочей папки (или какие-либо другие параметры), а потом уже аплоадить файл по абсолютному пути, а параметры брать, скажем, из сессии


Фишка в другом(по крайней мере для меня). При аплоаде мы имеем название фотки. И этого достаточно. Потому что мы по умолчанию аплоадим в data/(например). А после того как наступил onComplete, мы вызываем функцию, которая берет эту фотку(в data/), и переносит в ту папку, которую нам надо. Ну а далбше дело механизма...

sem1313
07.12.2006, 15:11
Да все это такая ХернЯ... простите меня(но я сделал эту херню... или приблизился к ней...). Вырабатывать механизм работы для 5% из 95% компьютеров... Как то странно.

Но если в мире где то ест Mac'и, то нужно стремится к всепоглощению...

etc
07.12.2006, 15:17
Сам с собой разговариваешь? :)
Придумал как сделать — сделай.

vic_
07.12.2006, 15:19
Что касается onHTTPError - это знакомо. Была проблема, выдавал на маке ошибку 500. Как оказалось - что то заказчик нахимичил на апаче, редиректил пользователя куда то, а маку эти штучки были пофигу, куда ему сказали туда он и обращался. Заказчик сам разобрался, я туда не лез.
Папку я зашил жестко в скрипте, это правда

<?php
foreach ($_FILES as $fieldName => $file) {
echo move_uploaded_file($file['tmp_name'], "uploads/" .$folder . $file['name']);
}
?>

код в общих чертах

uploadBtn.addEventListener('click', Delegate.create(this, btnOnUpload));
this.imageTypes = {description:"Images (*.jpg, *.jpeg)", extension:"*.jpg; *.jpeg", macType:"JPEG"};

this.fileUpload = new Object();
fileUpload.onSelect = Delegate.create(this, objUploadSelect);
fileUpload.onCancel = Delegate.create(this, objUploadCancel);
fileUpload.onOpen = Delegate.create(this, objUploadOpen);
fileUpload.onIOError = Delegate.create(this, objUploadIOError);
fileUpload.onHTTPError = Delegate.create(this, objUploadHTTPError);
fileUpload.onProgress = Delegate.create(this, objUploadProgress);
fileUpload.onComplete = Delegate.create(this, objUploadComplete);
fileRef = new flash.net.FileReference();
fileRef.addListener (fileUpload);

private function objUploadSelect(f):Void{
var fileExt:String=f.name.substr(f.name.length-4,f.name.length).toUpperCase();
if ((fileExt == ".JPG"||fileExt == "JPEG") && f.size <= 1000000) {
warningMessage.text='*****************';
} else {
if(f.size <= 100000){
warningMessage.text='*****************';
}else{
warningMessage.text='***************';
}
}
}

private function btnOnUpload():Void{ fileRef.upload( "upload.php" ) };



то есть ничего особенного, все по хелпу

sem1313
07.12.2006, 15:23
Через Delegate все?!...

vic_
07.12.2006, 15:25
да просто взял за правило, что бы не помнить что мне тогда приходило в голову и как я решил срезать угол. удобно и все

etc
07.12.2006, 15:26
Это кусок из класса.

sem1313
07.12.2006, 15:29
Но че то не понял

sem1313
07.12.2006, 15:41
При чем тут Delegate?

Зачем использовать Delegate, если есть пред-определенные события?

Мне то важно понять как их использовать во всех Оськах...

vic_
07.12.2006, 15:48
ну забудь про Delegate, присваивай сразу функцию. просто в классе будут проблемы с областью видимости. Это же данной проблемы не касается

sem1313
07.12.2006, 16:01
Всем спасибо.

Особенную благодарность выражаю _etc.

Thanks!

Глот
05.04.2007, 10:27
Решил написать в этой же теме. Точно для той же цели применяю две флешки, первая многофункциональная, одна из её функций - при нажатии на соотв. кнопку осуществляется загруз файла на сервер (FileReference), при этом передаются данные на вторую флешку (LocalConnection), которая демонстрирует прогресс.
Фрагмент кода в первой:
pic_listner.onProgress = function(file:FileReference, bytesLoaded:Number, bytesTotal:Number):Void {
onEnterFrame = function () {
var dat = bytesLoaded;
var lc = new LocalConnection();
lc.send("connectID", "method", dat);
delete lc;
};
trace("onProgress with bytesLoaded: "+bytesLoaded+" bytesTotal: "+bytesTotal);
};
Во второй флешке прогресс выводится в текстовом поле:
var lc = new LocalConnection();
lc.method = function(dat) {
if (dat != undefined) _root.danny=dat;
}
lc.connect("connectID");
и всё вроде работает, но почему-то отображаемый прогресс не соответствует действительности, т.е. реально файл, к примеру, 1.5 мега загружается на сервер секунд 20, а прогресс якобы до загрузки полного объёма файла показывает в течение секунд трёх, не более.. В чём тут дело?

etc
05.04.2007, 13:01
Так ведь передается не процент загрузки, а только кол-во загруженных байт.
А ещё, создавать и удалять постоянно LocalConnection очень неэкономно.

Глот
05.04.2007, 13:45
Это понятно, что не проценты, дело же не в этом.. Проценты сделаю позже, это пустяк сделать пересчёт и оформить графически. Судя по отображению загруженных байтов, любой величины файл загружается в течение 1-3 секунд. Такое ощущение, что "bytesLoaded" отображает не загруженные байты на сервер, а скопированные в локальный буфер :(
ЗЫ: "onEnterFrame" я уже убрал, чтоб пореже "создавать и удалять", работает так же.

etc
05.04.2007, 14:09
Нерабочий пример сваять можешь?

Глот
05.04.2007, 15:16
Нерабочий пример сваять можешь?
ну чего издеваться? :mad: рабочим вариантом можно считать тот, который будет реально отображать байты, залитые на сервер. У меня же файл ещё далеко не загружен, а уже всё отобразилось.

etc
05.04.2007, 15:18
Я не издеваюсь. Чтобы видеть проблему, нужно воссоздать условия для неё. Ну раз сам себе помочь не хочешь, то извините.

Глот
05.04.2007, 17:12
Я не издеваюсь.
Значит, мне померещилось, не понял твою мысль, поторопился с ответом :rolleyes:

вот что получилось:
16948

sem1313
09.04.2007, 15:36
Я в свое время намаялся с аплоадом для Маков... в твоем случае просто нужно проверить вообще тикают ли проценты? В той же флешке, где кнопка аплоада, сделай текстовое поле и в него выводи проценты... а как заметил __etc, то LocalConection вообще "отвратная" штука...

etc
09.04.2007, 20:44
а как заметил __etc, то LocalConection вообще "отвратная" штука...
Где это я такое сказал?

2Автор, у меня сейчас нет времени разбирать твой пример, увы.

wvxvw
01.07.2007, 19:22
Локал коннекш маками не поддерживается в принципе. В хелпе об этом написано.

Kikasso
01.07.2007, 19:34
Локал коннекш маками не поддерживается в принципе. В хелпе об этом написано.
Где об этом написано?? Вы что, серьезно?

etc
01.07.2007, 19:42
Локал коннекш маками не поддерживается в принципе. В хелпе об этом написано.
Ссылочку можно? Скролл — я ещё понимаю, не работает. Но LocalConnection…

wvxvw
02.07.2007, 16:40
http://www.actionscript.org/forums/showthread.php3?s=&threadid=19653
Пост #9.
Возможно информация устарела, я давно не имел дела с маками. Но раньше это было именно так...

Kikasso
02.07.2007, 18:11
При чем тут LocalConnention??

etc
02.07.2007, 18:12
Что-то не припомню я LocalConnection в 2002-ом году…

iNils
02.07.2007, 18:41
wvxvw перепутал Live Connection с LocalConnection

etc
02.07.2007, 20:04
swLiveConnect который? Он же fscommand?

wvxvw
03.07.2007, 13:25
Ой млин, простите. Перепутал.