2014-10-05 7 views
-2

Есть ли способ, в JavaScript, выполняющемся в браузере клиента, получить доступ к локальному файлу для ввода-вывода следующим образом? Файл добавляется регулярно (каждые ~ 25 мс). Мы хотим читать каждую новую строку по мере ее поступления. Предпочтительно асинхронно (мы получаем какой-то сигнал или выполняется обратный вызов), когда что-либо добавляется. Это возможно? Если да, то как?Чтение локального файла в javascript

Мой опыт работы с Javascript ограничен D3, поэтому основное объяснение того, как и почему/почему это невозможно, было бы оценено. Я полностью понимаю, что это невозможно по соображениям безопасности.

РЕДАКТИРОВАТЬ: просто, чтобы все было ясно, файл находится на компьютере клиентов. Файл представляет собой текстовый файл. Процесс, добавляемый к нему, является собственным процессом на машине клиента.

+0

Возможно, вы найдете ответ, выполнив поиск старых страниц переполнения стека –

+0

Да, вы можете использовать AJAX. –

+1

локальный файл в клиентской машине? разве это не угроза безопасности? – mithunsatheesh

ответ

2

Ответ на самом деле нет, нет.

НО есть некоторые обходные пути, в зависимости от того, что вы можете уйти с (поддерживаемыми браузерами и т.д.)

Когда вы захватить локальный файл (я предполагаю, что вы используете <input type="file">, а чем частично поддерживаемые, нестандартные методы), вы получаете событие "change" для подписки, но это изменение отражает изменение выбранных файлов, а не изменение содержимого конкретного файла.

Перемещение за пределы этого, если у вас есть Blob или File, который наследуется от Blob, у вас в основном есть буфер, полный данных.

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

В качестве альтернативы, из блоба или файла вы можете использовать URL.createObjectURL(file), который возвращает временный url, который ссылается на файл, а не на содержимое файла.

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

Не было бы обратного вызова; однако вы можете настроить интервальное биение, сделать вызов XHR для этого URI, а затем сравнить .responseText с предыдущими .responseText.

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

var input = document.querySelector("input[type='file']"), // client must open file, themselves 
    fileHandle = "", // this will be the url for the local file 
    content = "", // this will be the latest contents of the file 
    previousContent = ""; // this will be the previous contents 

var ms = 1000, 
    secs = 2, 

    pollId; // will be the process ID for the polling (so you can stop checking for changes, later). 

// wait for a file to be selected 
input.addEventListener("change", function (evt) { 

    var file = evt.target.files[0]; // grab the file object 
    fileHandle = URL.createObjectURL(file); // create a url which points to the local file 

    // create an interval to check for changes 
    pollId = setInterval(
     getLatest(fileHandle, getCurrent, updateCurrent), 
     secs * ms 
    ); 
}); 

function updateCurrent (latest) { 
    current = latest; 
    doStuff(current); 
    // the text has changed; it's been updated; 
    // now call home or do something else 
} 

function getCurrent() { return current; } 

function getLatest (url, getCurrent, onchange) { 
    return function() { 
     // this isn't actually calling the network 
     // it's calling the local file 
     var xhr = new XMLHttpRequest(); 
     xhr.open("GET", url); 

     xhr.onload = function() { 
      var latest = xhr.responseText; 
      if (getCurrent() !== latest) { onchange(latest); } 
     }; 

     xhr.send(); 
    }; 
} 

У вас теперь есть опрос изменений в поддерживающих браузерах.

+0

Спасибо за это. Я нашел некоторые другие методы (для собственного приложения), которые делают то, что я хочу довольно легко, поэтому пока я иду в этом направлении, но я мог бы прототип этого. –

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