Вопрос по javascript, download, jquery – JavaScript: Как открыть возвращенный файл через AJAX

3

Это похоже на:Как открыть файл с помощью JavaScript?

Goal: to retrieve/open a file on an image's double click
function getFile(filename){
   // setting mime this way is for example only
   var mime = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';

   jQuery.ajax({ url      : 'get_file.pl',
                 data     : {filename:filename}, 
                 success  : function(data){
                               var win = window.open('','title');
                               win.document.open(mime);
                               win.document.write(data);
                               win.document.close();
                            }
               });
}

jQuery('#imgID').dblclick(function(){ 
   getFile('someFile.docx');
});

Я делаю это изо всех сил, но я думаю, что вышесказанное будет работать для текстовых файлов, но не для двоичных файлов. Есть ли плагин, который делает это правильно? Идеальным было бы открыть файл в браузере (или приложении), а не скачать, но я сомневаюсь, что это мечта. Если файл должен быть загружен с помощью диалогового окна сохранения / открытия, это нормально.

Edit:

Я забыл упомянуть одну информацию: мне бы хотелось, чтобы это был запрос POST. Это частично, почему я смотрел на AJAX для начала. Я видел обходные пути, которые создавали формы / фреймы для выполнения чего-то подобного, но я искал лучший обработчик возвращаемой информации.

В чем разница с похожим вопросом, который вы связали? Bergi
@ Берги: хороший вопрос. (1) вопрос, на который я ссылаюсь, использует Prototype, а в моем примере я использую jQuery; Я не уверен, есть ли разница в возвращаемом объекте от их AJAX-запроса, но я думаю, что jQuerydata возвращает текст / строку (2) Я, возможно, не указал одну важную деталь, которую я хотел бы избежать запроса GET. vol7ron
@Bergi: опять же, ответ на странице, с которой я связан, имеет дело сresponseTextтак что я думаю, что они были похожи в этом отношении; тем не менее, этот вопрос возник почти 3 года назад, и с тех пор многое изменилось в javascript, особенно с более широким распространением HTML5. vol7ron
Насколько я знаю, браузеры предотвращают прямое выполнение приложения (в целях безопасности, я считаю), если в браузере не установлен плагин (например, flash, Adobe Reader и т. Д.) Или не назначен обработчик (например, ссылки на магниты). В противном случае он позволит вам сохранить файл и открыть его вручную. Joseph

Ваш Ответ

1   ответ
5

что нет причин делать это через AJAX. Просто откройте новое окно, чтобыget_file.pl?filename=... и пусть браузер справится с этим. Если у пользователя есть плагин, способный обрабатыватьContent-Type Отправлено отget_file.pl, файл будет отображаться; в противном случае он должен загружаться как любой другой файл.

function getFile(filename) {
   window.open('get_file.pl?filename=' + filename,'title');
}

jQuery('#imgID').dblclick(function() { 
   getFile('someFile.docx');
});

Edit: Если хотитеPOST на ваш сценарий,ты можешь это сделать с некоторыми<form> повозка, запряженная волами:

function getFile(filename) {
    var win = 'w' + Math.floor(Math.random() * 10000000000000);
    window.open('', win,'width=250,height=100');
    var f = $('<form></form>')
            .attr({target: win, method:'post', action: 'get_file.pl'})
            .appendTo(document.body);

    var i = $('<input>')
            .attr({type:'hidden',name:'filename',value:filename})
            .appendTo(f);

    f[0].submit();
    f.remove();
}

Конечно, это несколько глупо, поскольку невозможно скрыть ваши данные от «посторонних глаз». с инструментами разработчика. Если ваше имя файла действительно деликатное, выдайте клиенту токены доступа и найдите данные в своем скрипте сервера.

@ Берги, не обязательно; см. правки
Я все еще хотел бы, чтобы был лучший способ без Flash или элементов управления form / iframe, но я полагаю, что это подойдет. Я подозреваю, что HTML5 может иметь лучшую технику обработки файлов. vol7ron
ОК, вы можете POST в такое окно, это правда.
Можете ли вы открыть новое окно с помощью запроса POST? Обычно это не рекомендуется, но могут быть некоторые данные, которые мы хотим скрыть от посторонних глаз. vol7ron
Нет, window.open не поддерживает POST. Все данные видны пользователю, но если вы не хотите, чтобы они отображались в адресной строке, вы можете передать их с помощью файлов cookie.

Похожие вопросы