282 votes

Existe-t-il un moyen de spécifier un nom de fichier suggéré lors de l'utilisation de data : URI ?

Si par exemple vous suivez le lien :

data:application/octet-stream;base64,SGVsbG8=

Le navigateur vous invite à télécharger un fichier constitué des données contenues en base64 dans l'hyperlien lui-même. Existe-t-il un moyen de suggérer un nom par défaut dans le balisage ? Sinon, existe-t-il une solution JavaScript ?

219voto

Dan Fabulich Points 6143

Google vient d'annoncer une démo d'un nouvel attribut "download" de <a> qui vous permet de définir le nom de fichier du lien. Utilisable uniquement dans Chrome 14. http://html5-demos.appspot.com/static/a.download.html

71voto

Holf Points 1952

Chrome rend cela très simple de nos jours :

function saveContent(fileContents, fileName)
{
    var link = document.createElement('a');
    link.download = fileName;
    link.href = 'data:,' + fileContents;
    link.click();
}

42voto

Alnitak Points 143355

Selon RFC 2397 Non, il n'y en a pas.

Il ne semble pas non plus y avoir attribut de la <a> que vous pouvez utiliser soit.

21voto

sherpya Points 2616

J'ai regardé un peu dans les sources de firefox dans netwerk/protocol/data/nsDataHandler.cpp

Le gestionnaire de données analyse seulement le contenu/type et le jeu de caractères, et regarde s'il y a ";base64" dans la chaîne de caractères. dans la chaîne

la rfc ne spécifie aucun nom de fichier et au moins firefox ne gère aucun nom de fichier pour cela, le code génère un nom aléatoire avec ".part".

J'ai également vérifié le journal de Firefox

[b2e140]: DOCSHELL 6e5ae00 InternalLoad data:application/octet-stream;base64,SGVsbG8=
[b2e140]: Found extension '' (filename is '', handling attachment: 0)
[b2e140]: HelperAppService::DoContent: mime 'application/octet-stream', extension ''
[b2e140]: Getting mimeinfo from type 'application/octet-stream' ext ''
[b2e140]: Extension lookup on '' found: 0x0
[b2e140]: Ext. lookup for '' found 0x0
[b2e140]: OS gave back 0x43609a0 - found: 0
[b2e140]: Searched extras (by type), rv 0x80004005
[b2e140]: MIME Info Summary: Type 'application/octet-stream', Primary Ext ''
[b2e140]: Type/Ext lookup found 0x43609a0

des fichiers intéressants si vous voulez regarder les sources de Mozilla :

data uri handler: netwerk/protocol/data/nsDataHandler.cpp
where mozilla decides the filename: uriloader/exthandler/nsExternalHelperAppService.cpp
InternalLoad string in the log: docshell/base/nsDocShell.cpp

Je pense que vous pouvez arrêter de chercher une solution pour l'instant, car je soupçonne qu'il n'y en a pas :)

comme on l'a remarqué dans ce fil de discussion, html5 a download attribut, il fonctionne aussi sur firefox 20 http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#attr-hyperlink-download

16voto

owencm Points 271

L'extrait Javascript suivant fonctionne dans Chrome en utilisant le nouvel attribut "download" des liens et en simulant un clic.

function downloadWithName(uri, name) {

    function eventFire(el, etype){
        if (el.fireEvent) {
            (el.fireEvent('on' + etype));
        } else {
            var evObj = document.createEvent('Events');
            evObj.initEvent(etype, true, false);
            el.dispatchEvent(evObj);
        }
    }

    var link = document.createElement("a");
    link.download = name;
    link.href = uri;
    eventFire(link, "click");

}

L'exemple suivant montre son utilisation :

downloadWithName("data:,Hello%2C%20World!", "helloWorld.txt")

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X