Просмотр полной версии : тонкости FileReference
Сделал я стало быть флешку. Oна должна аплоадить файл на сервер и показывать прогресс.
Тестим - по идее все грузится как положено. Прогресс показывает, вложил дебаг.текстовое Поле чтобы смотреть как килобайты идут - то же все ок, все в соответствии с кодом.
НО. По концу загрузки onComplete вроде как срабатывает не сразу, а после серьезной такой паузы (секунд 10).
Не пойму абсолютно в чем причина.
Кто знает механику проесса?
Естественно на серваке есть пхп скрипт, который принимает файл, иначе бы онКомплит вообще бы не возникало.
с флешкой все ок оказалось.
Существуют проблемы имено на стороне сервера.
Причем странно - я тестирую - все отлично работает, на "принимающей" стороне - тестируют - проблемы продолжаются
Так что вопрос уходит в теоретический план:
кому что известно о механике процесса, кто пользовал ФайлРеференс, какие тонкости замечены?
Работаю с FileReference на Macintosh.
У bbexp была пауза, после загрузки файла на сервер. А у меня вообще не срабатывает onComplete.
Тот же самый риторический вопрос - почему?
Главное на PC все работает, а на Mac'е нет. Процесс аплоада отображается верно, т.е. проценты тикают, и там(PC), и там(Mac)
Походу ни у кого Mac'ов нет...
И это правильно. Я уже с ним закалупался...
Может кто хоть теоретически представляет в чем может трабла?
я на винде, но заказчик тестит и под мак, все нормально работает, были только траблы с определением типа файла для jpeg, запутался с этим macType:"JPEG", плюнул и вытаскиваю парсингом строки из имени файла.
Может у вас с серверной частью проблемы.
Ну раз проценты тикают, на сотом и завершишь работу =)
Вообще, под макосью я такие эксперименты не ставил, но можно будет попробовать…
я на винде, но заказчик тестит и под мак
В том то и дело, что заказчик тестит под все подряд, и под 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);
}
Ну раз проценты тикают, на сотом и завершишь работу =)
Ну, _etc, а не через какое ли, это место(?)
Раз есть событие onComplete, то наверняка оно должно выполнятся. При чем под любой системой. Если в Flash, это все интегрированно...
Я конечно могу сделать проверку в onProgress, на 1, но согласись это не совсем корректно будет. И не факт, что это поможет, так как я понимаю 100% - это не Init(по примеру в MovieClipLoader)...
vic, можешь сюда запостить кусок скрипта, который отвечает за select и onComplete?
_etc у тебя Mac?
Если да, то попробуй аплоад...
Если нет, то можно и не отвечать.
Мне нужны советы, тех кто пользовал на маке флешку, именно в том контексте, который мне нужен.
sem1313, сваяй пример, я попробую.
А чем тебя проценты не устраивают? Дошло до ста — подожди секунду и считай onComplete :)
Скорее всего проблема в сервере, а не во Flash, гадать на кофейной гуще можно долго и упорно.
Скорее всего проблема в сервере
В том то и дело, что PC реагирует/исполняет все необхожимые действия вовремя и исправно, а вот Mac, при том же коде просто не получает события onComplete...
Я уже не знаю что думать.
У меня заказчик тоже шарит во 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 скрипт может два раза вызваться и не ошибиться.
В общем у меня каша в голове....
sem1313, тогда проблема ещё будет в браузере — заливкой, в принципе, занимается браузер и сообщает флешу о результатах.
При аплоаде, мне в хвосте нужно передать несколько переменных - 1)Место назначения(папка куда фотка должна упасть); 2) Имя самой фотки.
Дело не в перменных или именах, а в том, что если передавать ЛЮБЫЕ перменные в хвосте функции upload, то в случае с Macintosh, ни че не срабатывает. Зато если передавать только АБСОЛЮТНЫЙ путь к скрипту php, то все работает...
Поправлюсь.
Если передаватьТОЛЬКО абсолютный путь
_etc, ты не туда рулишь(или я не догоняю о чем ты). Дело в onComplete
onComplete браузер может не передать.
Есть предложение переделать: сначала послать запрос на выбор папки, а потом просто отправлять файл в скрипт без параметров (имя папки будет сохранено, скажем, в
сессии).
Мне заказчик(доброй души человек) предоставил код, который по его мнению работает везде(хоть на PC, хоть на Mace). Ну так там единственное(принципиальное) различие с моим кодом состоит в названиях объектов:FileReference...
И самое главное, что это работает.
Еще одна особенность, что при аплоаде указывается абсолютный адрес до скрипта... - http://www.upload.com/upload_image.php...
Но это тольео для Mac, для PC, можно указывать относительный.
В общем короче, я запарился... Пойду куплю пива...
_etc, спасибо. Ты действительно можешь знать о том о чем не знаешь(в лучшем смысле)...
Просто, дело в том. Объясню популярнее... Если сделать ПРОСТО выбор, и не передавать затем PHP скрипту какие либо праметры, то все работает на УРА. И в PC, и в Mac. Но если попытатся передать в хвосте "?photo = "+makaka.jpg+"&folder = "+folderData; то PC все КОРРЕКТНО передает, а вот Mac... извините... обкекался...
_etc, спасибо. Ты действительно можешь знать о том о чем не знаешь(в лучшем смысле)
Не понял :)
Я же предложил — слать сначала запрос, чтобы на сервере сохранилось имя рабочей папки (или какие-либо другие параметры), а потом уже аплоадить файл по абсолютному пути, а параметры брать, скажем, из сессии.
У меня сложился другой путь
Сначала делаю аплоад. Который работает и на PC, и на Mac. По умолчанию делается директория - data/ (например). Потом из этой директории(а следом идет другой php-скрипт, который ресайзит фотку и пихает по нужным папкам). Так можно, и наверно полезно... Но почему onComplete не срабатывает на Mac'е... - это самый интересный вопрос...
Но почему onComplete не срабатывает на Mac'е... - это самый интересный вопрос...
Понятия не имею, примера я не увидел, а экспериментировать и писать скрипты — некогда.
Я же предложил — слать сначала запрос, чтобы на сервере сохранилось имя рабочей папки (или какие-либо другие параметры), а потом уже аплоадить файл по абсолютному пути, а параметры брать, скажем, из сессии
Фишка в другом(по крайней мере для меня). При аплоаде мы имеем название фотки. И этого достаточно. Потому что мы по умолчанию аплоадим в data/(например). А после того как наступил onComplete, мы вызываем функцию, которая берет эту фотку(в data/), и переносит в ту папку, которую нам надо. Ну а далбше дело механизма...
Да все это такая ХернЯ... простите меня(но я сделал эту херню... или приблизился к ней...). Вырабатывать механизм работы для 5% из 95% компьютеров... Как то странно.
Но если в мире где то ест Mac'и, то нужно стремится к всепоглощению...
Сам с собой разговариваешь? :)
Придумал как сделать — сделай.
Что касается 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" ) };
то есть ничего особенного, все по хелпу
да просто взял за правило, что бы не помнить что мне тогда приходило в голову и как я решил срезать угол. удобно и все
При чем тут Delegate?
Зачем использовать Delegate, если есть пред-определенные события?
Мне то важно понять как их использовать во всех Оськах...
ну забудь про Delegate, присваивай сразу функцию. просто в классе будут проблемы с областью видимости. Это же данной проблемы не касается
Всем спасибо.
Особенную благодарность выражаю _etc.
Thanks!
Решил написать в этой же теме. Точно для той же цели применяю две флешки, первая многофункциональная, одна из её функций - при нажатии на соотв. кнопку осуществляется загруз файла на сервер (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, а прогресс якобы до загрузки полного объёма файла показывает в течение секунд трёх, не более.. В чём тут дело?
Так ведь передается не процент загрузки, а только кол-во загруженных байт.
А ещё, создавать и удалять постоянно LocalConnection очень неэкономно.
Это понятно, что не проценты, дело же не в этом.. Проценты сделаю позже, это пустяк сделать пересчёт и оформить графически. Судя по отображению загруженных байтов, любой величины файл загружается в течение 1-3 секунд. Такое ощущение, что "bytesLoaded" отображает не загруженные байты на сервер, а скопированные в локальный буфер :(
ЗЫ: "onEnterFrame" я уже убрал, чтоб пореже "создавать и удалять", работает так же.
Нерабочий пример сваять можешь?
Нерабочий пример сваять можешь?
ну чего издеваться? :mad: рабочим вариантом можно считать тот, который будет реально отображать байты, залитые на сервер. У меня же файл ещё далеко не загружен, а уже всё отобразилось.
Я не издеваюсь. Чтобы видеть проблему, нужно воссоздать условия для неё. Ну раз сам себе помочь не хочешь, то извините.
Я не издеваюсь.
Значит, мне померещилось, не понял твою мысль, поторопился с ответом :rolleyes:
вот что получилось:
16948
Я в свое время намаялся с аплоадом для Маков... в твоем случае просто нужно проверить вообще тикают ли проценты? В той же флешке, где кнопка аплоада, сделай текстовое поле и в него выводи проценты... а как заметил __etc, то LocalConection вообще "отвратная" штука...
а как заметил __etc, то LocalConection вообще "отвратная" штука...
Где это я такое сказал?
2Автор, у меня сейчас нет времени разбирать твой пример, увы.
Локал коннекш маками не поддерживается в принципе. В хелпе об этом написано.
Локал коннекш маками не поддерживается в принципе. В хелпе об этом написано.
Где об этом написано?? Вы что, серьезно?
Локал коннекш маками не поддерживается в принципе. В хелпе об этом написано.
Ссылочку можно? Скролл — я ещё понимаю, не работает. Но LocalConnection…
http://www.actionscript.org/forums/showthread.php3?s=&threadid=19653
Пост #9.
Возможно информация устарела, я давно не имел дела с маками. Но раньше это было именно так...
При чем тут LocalConnention??
Что-то не припомню я LocalConnection в 2002-ом году…
wvxvw перепутал Live Connection с LocalConnection
swLiveConnect который? Он же fscommand?
Ой млин, простите. Перепутал.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.