Есть ли способ указать предложенное имя файла при использовании data: URI? - PullRequest
212 голосов
/ 12 ноября 2008

Если, например, вы переходите по ссылке:

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

Браузер предложит вам загрузить файл, содержащий данные, хранящиеся в виде base64 в самой гиперссылке. Есть ли способ предложить имя по умолчанию в разметке? Если нет, есть ли решение JavaScript?

Ответы [ 16 ]

4 голосов
/ 12 января 2012

В Google Code есть небольшой обходной скрипт, который работал для меня:

http://code.google.com/p/download-data-uri/

Он добавляет форму с данными в ней, отправляет ее, а затем снова удаляет форму. Хаки, но это сделало всю работу за меня. Требуется JQuery.

Эта тема появилась в Google до кодовой страницы Google, и я подумал, что здесь тоже может быть ссылка.

3 голосов
/ 20 февраля 2014

Вот версия jQuery, основанная на версии Холфа и работающая с Chrome и Firefox, тогда как его версия работает только с Chrome. Немного странно добавлять что-то в тело, чтобы сделать это, но если у кого-то есть лучший вариант, я полностью за это.

var exportFileName = "export-" + filename;
$('<a></a>', {
    "download": exportFileName,
    "href": "data:," + JSON.stringify(exportData, null,5),
    "id": "exportDataID"
}).appendTo("body")[0].click().remove();
3 голосов
/ 30 мая 2011

Это немного хакерски, но я уже был в такой же ситуации. Я динамически генерировал текстовый файл в javascript и хотел предоставить его для загрузки, закодировав его с помощью data-URI.

Это возможно при незначительном значительном вмешательстве пользователя. Сгенерировать ссылку <a href="data:...">right-click me and select "Save Link As..." and save as "example.txt"</a>. Как я уже сказал, это не элегантно, но работает, если вам не нужно профессиональное решение.

Это можно сделать менее болезненным, если сначала использовать флэш для копирования имени в буфер обмена. Конечно, если вы позволите себе использовать Flash или Java (я думаю, что теперь все меньше и меньше поддерживает браузер?), Вы, возможно, найдете другой способ сделать это.

2 голосов
/ 02 января 2016

Этот работает с Firefox 43.0 (старый не тестировался):

dl.js:

function download() {
  var msg="Hello world!";
  var blob = new File([msg], "hello.bin", {"type": "application/octet-stream"});

  var a = document.createElement("a");
  a.href = URL.createObjectURL(blob);

  window.location.href=a;
}

dl.html

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta charset="utf-8"/>
    <title>Test</title>
    <script type="text/javascript" src="dl.js"></script>
</head>

<body>
<button id="create" type="button" onclick="download();">Download</button>
</body>
</html>

Если нажата кнопка, для загрузки предлагается файл с именем hello.bin . Хитрость заключается в том, чтобы использовать File вместо Blob .

ссылка: https://developer.mozilla.org/de/docs/Web/API/File

0 голосов
/ 26 ноября 2016

Вы действительно можете достичь этого в Chrome и FireFox.

Попробуйте следующий URL, он загрузит использованный код.

data:text/html;base64,PGEgaHJlZj0iZGF0YTp0ZXh0L2h0bWw7YmFzZTY0LFBHRWdhSEpsWmowaVVGVlVYMFJCVkVGZlZWSkpYMGhGVWtVaUlHUnZkMjVzYjJGa1BTSjBaWE4wTG1oMGJXd2lQZ284YzJOeWFYQjBQZ3BrYjJOMWJXVnVkQzV4ZFdWeWVWTmxiR1ZqZEc5eUtDZGhKeWt1WTJ4cFkyc29LVHNLUEM5elkzSnBjSFErIiBkb3dubG9hZD0idGVzdC5odG1sIj4KPHNjcmlwdD4KZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYScpLmNsaWNrKCk7Cjwvc2NyaXB0Pg==
0 голосов
/ 25 ноября 2015
var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6
var sessionId ='\n';
var token = '\n';
var caseId = CaseIDNumber + '\n';
var url = casewebUrl+'\n';
var uri = sessionId + token + caseId + url;//data in file
var fileName = "file.i4cvf";// any file name with any extension
if (isIE)
    {
            var fileData = ['\ufeff' + uri];
            var blobObject = new Blob(fileData);
            window.navigator.msSaveOrOpenBlob(blobObject, fileName);
    }
    else //chrome
    {
        window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
         window.requestFileSystem(window.TEMPORARY, 1024 * 1024, function (fs) {
            fs.root.getFile(fileName, { create: true }, function (fileEntry) { 
                fileEntry.createWriter(function (fileWriter) {
                    var fileData = ['\ufeff' + uri];
                    var blob = new Blob(fileData);
                    fileWriter.addEventListener("writeend", function () {
                        var fileUrl = fileEntry.toURL();
                        var link = document.createElement('a');
                        link.href = fileUrl;
                        link.download = fileName;
                        document.body.appendChild(link);
                        link.click();
                        document.body.removeChild(link);
                    }, false);
                    fileWriter.write(blob);
                }, function () { });
            }, function () { });
         }, function () { });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...