Flex FileReference – IOError lors de l'appel à download() [Résolu]
S'il on veut permettre à un utilisateur de télécharger une image située sur un serveur avec Flex, on peut faire appel à navigateToURL() qui va ouvrir l'image dans un navigateur plus il pourra faire clic droit>enregistrer sous. Ce qui n'est pas très pratique, il est généralement plus simple de faire appel à la méthode download() de FileReference. Pour plus d'informations sur le fonctionnement de cette méthode, consultez cet article:
Flex FileReference – Téléchargement de fichiers avec la méthode download()
Dans une de mes applications Flex, je devais télécharger une image située sur un serveur externe. De façon assez intuitive, j'ai donc essayé de faire:
private function downloadFile():void {
var urlRequest:URLRequest = new URLRequest("http://www.google.fr/intl/fr_fr/images/logo.gif");
var fileRef:FileReference = new FileReference();
fileRef.addEventListener(Event.COMPLETE, onComplete);
fileRef.download(urlRequest);
}
J'ai donc testé avec ce code (et bien etendu la fonction onComplete qui traite l'évènement COMPLETE) mais j'ai obtenu l'erreur suivante:
Error #2044: Unhandled IOErrorEvent:. text=Error #2038: File I/O Error.
Pour être bien sûr, j'ai ajouté un listener sur l'IOError:
fileRef.addEventListener(IOErrorEvent.IO_ERROR, dLHandleIOError);
//
private function dLHandleIOError(e:Event):void {
trace("IOError");
}
Et j'obtenais toujours une IOError (Input/Output Error). Une IOError signifie habituellement que le fichier distant n'existe pas ou n'a pas été trouvé mais là j'étais bien sûr d'avoir fourni le bon fichier. Après quelques recherches, il apparaît qu'il y a un bug avec FileReference. En effet, lorsque l'on appelle la méthode download() dans le même bloc que la déclaration de l'objet FileReference, on obtient une IOError, apparemment à cause d'un problème de garbage collector.
Il y a deux manières de résoudre ce problème:
- Déclarer l'objet FileReference en dehors de la fonction où l'on appelle download()
- Déclarer une fonction tout de suite après l'appel à download()
Voici donc un exemple qui montre comment résoudre ce bug de la classe FileReference:
private var fileRefDebug:FileReference = new FileReference();
private var imageURL:String = "http://www.google.fr/intl/fr_fr/images/logo.gif";
// télécharger le fichier
private function downloadFileDebug():void {
var urlRequest:URLRequest = new URLRequest(imageURL);
fileRefDebug.addEventListener(Event.COMPLETE, onCompleteDebug);
fileRefDebug.addEventListener(IOErrorEvent.IO_ERROR, dLHandleIOErrorDebug);
fileRefDebug.download(urlRequest);
}
// évènement COMPLETE
private function onCompleteDebug(e:Event):void {
trace("Téléchargement Terminé");
}
// IOError
private function dLHandleIOErrorDebug(e:Event):void {
trace("IOError");
}
Pour la seconde solution, il suffit de déclarer une fonction vide (pour éviter un passage du garbage collector):
private function downloadFileDebug():void {
var urlRequest:URLRequest = new URLRequest(imageURL);
var fileRefDebug:FileReference = new FileReference();
fileRefDebug.addEventListener(Event.COMPLETE, onCompleteDebug);
fileRefDebug.addEventListener(IOErrorEvent.IO_ERROR, dLHandleIOErrorDebug);
fileRefDebug.download(urlRequest);
var succeed:Function = function():void{};
}
Articles similaires
- Flex ActionScript – Intercepter l'Erreur #2044 (IOErrorEvent) lancée par Loader [Résolu]
- Flex FileReference – Téléchargement de fichiers avec la méthode download()
- Flex ActionScript – Gestion des erreurs synchrones en ActionScript 3
- Flex ActionScript – Gestion des erreurs asynchrones en ActionScript 3
- Flex FileReference – Upload de fichiers avec la méthode upload() et browse()






2 février 2011
Salut,
J'ai un petit grand problème avec FileReference.
Je n'arrive pas à accéder à toutes les méthodes publics de cette classe. par exemple j'ai besoin de la méthode save() et FileReference ne la propose pas pourtant cette méthode normalement existe pour cette classe. je précise que j'ai accès à download().
J'ai fait quelques recherches sur le net mais j'ai pas pu tirer une conclusion. par contre toutes les pistes mettent en cause la version de flash player utilisée; apparement il faut la version 10. j'ai vérifié ainsi ma version de flash player et j'ai bien la dernière.
sachant que je suis sur un projet web java/flex 3 sous eclipse (plugin flex builder), ma question est ce qu'on peut voir, modifier ou préciser la version de flash player utilisée pour le projet?
ou le problème n'est pas une histoire de version de flash player?
Merci.
2 février 2011
Bonjour,
pour modifier la version de FP cible, click droit sur le projet Properties > Flex Compiler. Changer 9 0 24 en 10 0 ou 10 1
Fabien
2 février 2011
Merci pour ce rapide retour, je testerai demain matin sur mon poste de travail et je vous tiens
au courant.
Merci encore.
3 février 2011
Bonjour,
voilà , je viens de tester , j'ai rensieigné 10 1 102 et j'ai finalement accès
à save() et à toutes les methodes de FileReference
Ca fait plaisir.
Merci.