En tant qu'utilisateur, je trouve parfois assez exaspérant de devoir ouvrir, par exemple, un fichier PDF dans mon navigateur. Je préfère largement le télécharger et l'ouvrir avec Acrobat Reader...

Lorsqu'il s'agit d'un lien dans une page HTML, il est facile d'utiliser un clic droit (ou CTRL pour les maceux) pour pouvoir choisir entre l'ouvrir réellement ou le télécharger. Par contre, dans un site Flash c'est plus délicat...

C'es pourquoi j'ai créé vite-fait une petite classe qui permet d'assigner à un clip un menu contextuel qui va permettre soit d'ouvrir, soit de télécharger un fichier déterminé. Elle est basique pour l'instant, mais l'on peut prévoir de la faire évoluer avec quelques options (localisation, cible du getURL, comportement par défaut du onRelease, etc...). :) A noter que le téléchargement ne fonctionne que dans un environnement HTTP (cela est du aux restrictions de la classe FileReference), donc on oublie le test dans l'IDE Flash ou dans une page HTML accédée directement depuis le disque dur... :(import flash.net.FileReference;
import mx.utils.Delegate;
/**
 * FileLink
 *
 * @notice Can only be used in HTTP environment due to FileReference restrictions
 * @author  <a href="http://www.lalex.com/">LAlex</a>
 * @version 1.0
 * @since   
 */

class com.lalex.utils.FileLink {
        // File path
        private var _path:String;
        function FileLink(f:String) {
                _path = f;
        }
        /**
         * Assign a link to a movieclip, setting its context menu
         *
         * @usage   fLink.assignTo(myLinkButton, true, true);
         * @param   clip       MovieClip to click to obtain download menu
         * @param   setRelease Set the onRelease handler of the clip ?
         * @param   hide       Hide context menu builtin items ?
         */

        function assignTo(clip:MovieClip, setRelease:Boolean, hide:Boolean) {
                hide = !!hide;
                setRelease = !!setRelease;
                var dl:Function = Delegate.create(this, this.download);
                var op:Function = Delegate.create(this, this.open);
                var m:ContextMenu = new ContextMenu();
                m.customItems.push(new ContextMenuItem("Ouvrir", op));
                m.customItems.push(new ContextMenuItem("Télécharger", dl));
                if (hide)
                        m.hideBuiltInItems();
                if (setRelease)
                        clip.onRelease = op;
                clip.menu = m;
        }
        /**
         * Open a file in the browser
         * Used by a proxy (Delegate) function
         */

        private function open() {
                getURL(_path);
        }
        /**
         * Dowload the file to the local computer
         * Used by a proxy (Delegate) function
         */

        private function download() {
                var f:FileReference = new FileReference();
                f.download(_path);
        }
}
Et voici son utilisation (celle du bouton ci-dessous)import com.lalex.utils.FileLink;
var fl:FileLink = new FileLink("files/FileLink.zip");
fl.assignTo(bt, true, true);




::Télécharger FileLink.zip::