PDA

Просмотр полной версии : FileReference#download() не принимает относительных путей.


GemiBillyBob
22.02.2011, 01:34
Здравствуйте.
Пробую с помощью FileReference#download() открыть файл, лежащий рядом с флешкой (предполагается локальный запуск флешки).
Делаю в обработчике клика кнопки:
var fileReference:FileReference = new FileReference();
fileReference.download(new URLRequest('docFile.doc'), 'docFile.doc');
/* Выдаёт ошибку:
Error: Error #2039: Неверный удаленный протокол URL. Удаленный протокол должен быть HTTP или HTTPS.
at flash.net::FileReference/download()
at classes.Main::fileReferenceButton/clickFRefBtnHandler() *.

Могу ли я перейти по относительной ссылке к файлу при локальном запуске флешки?
Открывать его не нужно, можно, чтоб через браузер он загрузился.

Спасибо.

КорДум
22.02.2011, 01:59
А если "/" поставить перед? Причем надо будет еще и экранировать - "//".

Добавлено через 2 минуты
А, если не пройдет, можно узнать, где лежит swf, и подставить в путь ее местонахождение. Как это сделать - поиск поможет.

in4core
22.02.2011, 04:02
ApplicationDomain разве не вернет localHost в данном случае?

cleptoman
22.02.2011, 11:15
при чем тут ApplicationDomain вообще?

in4core
22.02.2011, 12:46
при чем тут ApplicationDomain вообще?
Ну автор говорит что ему нужен путь типа http://.....doc, а апликайшн поидее вернет http://127.0.0.1 или нет ?

kackbip
22.02.2011, 12:57
Можно воспользоваться LoaderInfo#url

gloomyBrain
22.02.2011, 13:01
а апликайшн поидее вернет http://127.0.0.1 или нет ?

Вам сюда (http://help.adobe.com/ru_RU/AS3LCR/Flash_10.0/flash/system/ApplicationDomain.html)

wvxvw
22.02.2011, 14:37
А зачем вы это делаете?.. download() специально задуман для закачки по HTTP, зачем вам это делать локально?

GemiBillyBob
22.02.2011, 14:55
Ситуация была такова: например с диска или откуда-то (заранее не знаю месторасположение) запускается swf-ка и в ней есть кнопка типа "скачать документы в формате .doc" (он находится в соседней с флешкой папке, но подразумевается, что не все способны открыть папку с помощью Проводника).
В общем меня устроил следующий условный код.
Тут браузера окно запускается, лучше бы конечно без него — я думал FileReference#download мне поможет в этом:
var fileRelativePath:String="/docs/ImportantDocument.doc";
function getSwfFolder():String{
var st:String=loaderInfo.url;
var tempArr:Array=st.split("/");
tempArr.pop();
st=tempArr.join("/");
return st;
}
function clickHandler(e:MouseEvent):void{
navigateToURL(new URLRequest(getSwfFolder()+fileRelativePath));
}
Всем спасибо за участие.

wvxvw
23.02.2011, 01:06
Вы пытаетесь сделать программу для человека, который не умеет пользоваться компьютером? На флеше? Труд, конечно, достойный всяческих похвал, но... ну, даже не знаю, а если просто navigateToURL? так оно проводнику и отдаст решать, что делать с файлом.

Да, и еще такой момент, если в пути первый слеш, и это файловая система, то большинство операционных систем, если и сможет это понять, то поймут такой путь как абсолютный, т.е. ведущая косая - это ссылка на корневую директорию.
Если чесно, мне сейчас не на чем эксперементировать, и я практически уверен, что так работать не будет, но а что будет, если в качестве протокола указать file:///?

GemiBillyBob
23.02.2011, 01:16
О целесообразности прошу не говорить, тут это соль на рану, я молю богов о прощении за создание такого проекта.

file:/// с download() не работает, пишет ту же ошибку, что и в поcте в начале темы.

Gaen
23.02.2011, 04:12
И не заработает, в этом вся фишка. В тексте ошибки явно сказано: удаленный протокол должен быть HTTP или HTTPS. Это значит, что получить файл с локального компьютера при помощи FileReference.download() можно только при наличии на нем веб-сервера, отдающего файлы по указанным выше протоколам. Естественно, не стоит рассчитывать на его наличие у пользователей, неспособных открыть папку в проводнике :)
Чем вам не угодил тот же navigateToURL для открытия нужной папки?
В любом случае, вы хотите от флешки работы с локальной файловой системой - скопировать файлы из одного места в другое. Сам по себе флэшплеер вам такого не позволит, нужно либо засунуть его в обертку, либо писать вспомогательное приложение для вызова через fscommand.