FileReference et IOError
Par Cédric Tabin le jeudi 12.03.2009, 08:00 - ActionScript - Lien permanent
C'est pas nouveau, la classe FileReference est bugée au niveau de la méthode download... Mais il y a encore une subtilité qui n'est pas mentionnée dans la documentation qui m'a fait tourner en rond !
Je savais déjà qu'il y avait un (gros) souci de Garbage Collection sur FileReference. Donc, après avoir fait bien attention je me suis retrouvé avec le code suivant :
var fileRef:FileReference = new FileReference(); var url:String = "./images/logo.png"; private function onButtonClick():void { var urlRequest:URLRequest = new URLRequest(url); fileRef.download(urlRequest); }
Et à l'exécution j'ai droit à nouveau à cette fameuse erreur !
Error #2044: Unhandled IOErrorEvent:. text=Error #2038: File I/O Error.
Ayant cherché un moment d'où pouvait bien venir l'erreur, j'ai finalement trouvé : c'est l'URL du fichier !!! Celle-ci doit être absolue pour que le téléchargement fonctionne...
var fileRef:FileReference = new FileReference(); var url:String = "http://www.astorm.ch/images/logo.png"; private function onButtonClick():void { var urlRequest:URLRequest = new URLRequest(url); fileRef.download(urlRequest); }
Le fait que l'URL doit être donnée en absolue ne me pose pas de problème particulier. En revanche, je honnis les message d'erreur abracadabrantesque renvoyés, surtout lorsque la documentation est incomplète !
En espérant que ça en aide d'autres
Commentaires
Hello,
et si tu utilises un listeners pour les errors ??
par exemple, j'utilise ce leur pour un netstream :
Tout à fait C'est dans la documentation de la classe ErrorEvent que l'on comprend un peu mieux ce problème qui apparaît dans pas mal de classes du FlashPlayer :
var error:Function = function( e:ErrorEvent ):void
{
// trace( e ) ;
}
var fileRef:FileReference = new FileReference();
fileRef.addEventListener( IOErrorEvent.IO_ERROR , error ) ;
var url:String = "http://www.astorm.ch/images/logo.pn...";
var urlRequest:URLRequest = new URLRequest(url);
fileRef.download(urlRequest);
PS : dans ton code au dessus petit soucis sur les variables (nom utilisé dans l'URLRequest)
Salut eka et jeanphi
Oui bien sûr, après avoir vu l'erreur survenir dans le flash player debugger, j'ai fait un écouteur qui affichait toutes les données de l'IOErrorEvent. Toutefois, rien de spécial dans le message juste "I/O Error" et aucune indication (type fichier introuvable ou autre) qui puisse m'aider...
Ce n'est qu'en ayant vu les exemples que j'ai essayé (sans trop y croire) de mettre une URL absolue.
@++
ps. J'ai corrigé le code, merci eka
Bonjour à tous,
J'ai également rencontré le pb lors d'un appli que j'ai réalisé, mais ce pb se produisait que sous IE.
Salut,
Je précise que j'ai eu ce problème sur IE et Firefox
@++
Le problème est général, même dans le FlashPlayer standalone j'ai le problème pour ma part
Le plus chiant dans le fait de devoir passer une URL absolue c'est que si l'on développe un CD-rom on ne peut pas utiliser cette fonction pour que l'utilisateur enregistre un fichier du cd sur son pc.
Pour le moment j'utilise un
navigateToUrl
mais c'est loin d'être idéal.salut
en local et avec le Player 10 tu peux utiliser save plutot que download
un truc du genre >
@@
var fileRef:FileReference=new FileReference();
var loader:URLLoader = new URLLoader();
var resultData:ByteArray= new ByteArray();
var url:String="logo.jpg";
var downloadURL=new URLRequest(url);
resultData.endian=Endian.LITTLE_ENDIAN;
loader.dataFormat=URLLoaderDataFormat.BINARY;
loader.load(downloadURL);
btn_sauve.addEventListener(MouseEvent.CLICK,onClick);
function onClick(e:Event):void {
sauve();
}
function sauve() {
resultData=loader.data;
fileRef.save(resultData,"logocopie.jpg");
}
@@