2015-11-11 5 views
0

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

  1. Использование XMLHttpRequest для извлечения содержимого файла, а затем предлагают либо дисплей или Сохранить как особенности в зависимости от типа файла и предпочтений пользователя.

Я понимаю, как использовать бинарные функции Ajax (BLOB, ArrayBuffer) для извлечения двоичных файлов, и я видел this shim для реализации HTML5 Сохранить как функцию, но я обеспокоен производительности с этой техникой Re: большие файлы. Я еще не тестировал, но я не ожидаю, что хорошая производительность будет загружать 1 ГБ + файл, используя эту технику.

  1. Настройка HTTP-заголовка по ссылке (см. Ниже), поэтому я могу передать токен аутентификации в заголовке, но все же файл передается непосредственно в браузер, как обычная загрузка, а не в результате проблемы с получением содержимого с помощью XMLHttpRequest.

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

Firefox может устанавливать HTTP-заголовки в сетевых вызовах, не инициированных явно кодом JavaScript, используя httpChannel: Firefox HTTP channels. Кто-нибудь знает, поддерживается ли эта функциональность в других браузерах? Я хочу иметь возможность установить ссылку, например. :

window.location.href = 'blah'; 

и имеют код наблюдения сетевого трафика, который устанавливает пользовательский заголовок HTTP:

httpChannel.setRequestHeader("X-Hello", "World", false); 

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

Setting request header, in a URL

, которая в основном то, что я хочу сделать, но только рекомендуемое решение есть настройки куки сессии, которые я не использую.

+0

Это звучит как проблема XY. Каков ваш прецедент? – charlietfl

+0

Возможно, да, позвольте мне повторить проблему. –

+1

Что случилось с обычным входом в систему и разрешить загрузку только аутентифицированных пользователей? – PeeHaa

ответ

0

ОК, поэтому я построил функцию, используя вариант 1. из моего вопроса. Все еще беспокоит размер файла и производительность, но вот базовое решение:

viewFile : function(fileItem) { 

    var xhr = new XMLHttpRequest(), token, contentType, filename; 

    xhr.onreadystatechange = function() { 

     token = xhr.getResponseHeader("X-Token"); 

     if(token !== undefined && token !== null){ 
      app.model.set("token", token); 
      sessionStorage.token = token; 
     } 

     if (xhr.readyState === 4) { 
      contentType = xhr.getResponseHeader("Content-Type"); 
      filename = xhr.getResponseHeader("X-Filename"); 
      response = xhr.response; 
      var blob = new Blob([xhr.response], { type: contentType }); 
      saveAs(blob, filename); 
     } 
    }; 

    xhr.open('GET', "/index.cfm/api/filelocker/" + fileItem.fileid, true); 
    xhr.responseType = "arraybuffer"; 
    xhr.setRequestHeader ("X-Token", app.model.get("token")); 

    xhr.send();  
} 

Этот метод использует существующий механизм аутентификации. Я посмотрю, насколько хорошо он работает с большими файлами.

Смежные вопросы