Как принудительно сохранить как диалоговое окно в Firefox, кроме изменения заголовков?

Есть ли способ принудительно сохранить как диалоговое окно для www.example.com/example.pdf в ff? (я не могу изменить заголовки)


person Community    schedule 07.05.2009    source источник


Ответы (2)


Если вы можете вывести файл клиенту в base64, вы можете использовать URI данных для загрузки.

location.href = 'data:application/octet-stream;base64,' + appendPDFContentHere
OR
<a href="data:application/octet-stream;base64,appendPDFContentHere">pdf</a>

Это будет работать только в браузерах, отличных от IE, но, как вы просили для firefox, это должно работать нормально.

РЕДАКТИРОВАТЬ:

Оба приведенных ниже примера содержат байты для создания PNG. Если вы щелкнете по первому из них, вы сможете просмотреть изображение, как обычно в браузере. однако, если вы нажмете на вторую ссылку, это заставит вас загрузить изображение. Сохраните его как .png, и вы увидите, что это точно такие же изображения. Единственная разница в двух ссылках - это тип пантомимы.

просмотреть изображение (сокращенный URL предварительного просмотра) - тип пантомимы: image / png

загрузить изображение (сокращенный URL предварительного просмотра) - тип mime: application / octet-stream

Вы спросили, что вы добавили вместо appendPDFContentHere, и ответом являются байты в кодировке base64, составляющие PDF. Я использовал этот онлайн-кодировщик base64 для кодирования изображение, используемое в примере.

person fearphage    schedule 07.05.2009
comment
что мне добавить сюда, чтобы добавить PDF-контент? весь PDF? - person ; 07.05.2009
comment
Нет, если вы просто укажете URL-адрес, вы не сможете добавить тип mimetype (application / octet-stream). - person Matthew Flaschen; 07.05.2009
comment
@Tom: Ссылки на предварительный просмотр по-прежнему работают, и нажатие кнопки «Продолжить» внизу работает. Просто кажется, что прямые ссылки как-то не работают. - person fearphage; 14.07.2014
comment
@fearphage: извините, у меня не получилось, когда я попробовал его несколько дней назад; Я не знаю, в чем была проблема, но теперь она действительно работает. Спасибо! - person Tom; 16.07.2014

Единственный другой способ, о котором я могу думать, - это изменить настройки Firefox. Я полагаю, ты не сможешь этого сделать.

РЕДАКТИРОВАТЬ:

Я сколотил клиентское решение на основе идеи URI данных. Он использует модифицированную версию кодировщика base64 и методику двоичный XMLHTTPrequests Скрипт загружается PDF-файл, затем динамически генерирует и размещает ссылку URI данных с помощью кодировщика base64.

Это должно быть полезно, когда вы хотите кодировать поток октетов, но не имеете доступа к серверу (как, кажется, имеет место для OP).

Обратите внимание, я только что опубликовал пример, используя hunts.pdf, с которым ОП тестировал.

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/

var Base64 = {

    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr2raw, chr3, chr3raw, enc1, enc2, enc3, enc4;
        var i = 0;

        //input = Base64._utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++) & 0xFF;
            chr2 = isNaN(chr2raw = input.charCodeAt(i++)) ? NaN : (chr2raw & 0xFF);
            chr3 = isNaN(chr3raw = input.charCodeAt(i++)) ? NaN : (chr3raw & 0xFF);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

        }

        return output;
    }
}



// http://web.archive.org/web/20071103070418/mgran.blogspot.com/2006/08/downloading-binary-streams-with.html
//fetches BINARY FILES synchronously using XMLHttpRequest

load_url = function(url) {
    var req = new XMLHttpRequest();
    req.open('GET',url,false);
    //XHR binary charset opt by Marcus Granado 2006 [http://mgran.blogspot.com]
    req.overrideMimeType('text/plain; charset=x-user-defined');
    req.send(null);

    if (req.status != 200){
    alert(req.status);
    return '';
    }
    return req.responseText;
}

    function getDataURI(filename)
    {
    var file =  load_url(filename);
    var uueFile = Base64.encode(file);
    var uri = 'data:application/octet-stream;base64,' + encodeURIComponent(uueFile);
    return uri;
    }

 window.addEventListener("load",
                      function()
                      {
                        var link = getDataURI("foo.pdf");
                        document.getElementById("myDiv").innerHTML += '<a href="' + link + '"><code>' + link +  '</code></a><br><br>';
                      }
person Community    schedule 07.05.2009
comment
@raj: Это именно то, для чего нужны заголовки. Тело ответа - это контент, заголовки - это предложение, что с ним делать (например, Content-Disposition). - person Piskvor left the building; 07.05.2009
comment
спасибо за решение. Я пробовал использовать код. Вот нижняя часть кода, который я использовал: window.addEventListener (load, function () {var link = getDataURI (google.com/ads/hunts.pdf); document.getElementById (myDiv) .innerHTML + = '‹a href=' + ссылка +'› ‹code›' + ссылка + '‹ / code ›‹/A› ‹br› ‹br› ';} ‹/script› ‹body›‹ div id = myDiv ›hello ‹/div› ‹/body› ‹/html› К сожалению, в html-файле ничего не было, кроме слово привет. нет pdf. мне нужно что-то еще? - person ; 09.05.2009
comment
в ссылке я использовал google.com/ads/hunts.pdf. У меня был http перед этой ссылкой, но SO просто преобразует его в ссылку без http. - person ; 09.05.2009
comment
Прежде всего, вы можете выполнять вызовы XMLHttpRequest только на своем собственном сервере. Поэтому скопируйте PDF-файл на тот же сервер, что и HTML-страницу, и попробуйте еще раз. Если по-прежнему не работает, включите проверку ошибок JavaScript и сообщите нам, какие ошибки вы получаете. - person Matthew Flaschen; 09.05.2009