Доступ к локальным файлам с локальным Javascript

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

Можно ли получить доступ к локальным файлам из JavaScript, который работает локально на машине (AKA, мой адрес веб-сайта будет file:///C:/...)? Или это тоже песочница?

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

Спасибо.

Ответ 1

Веб-страница может читать любой файл на том же сервере, на котором он был загружен (это межсайтовая политика JavaScript). Это означает, что файл страницы:///C:/mywebsite/index.html может читать файл файла://C:/somedir/somefile.xml. Чтобы прочитать этот файл, используйте ajax, загрузите его в iFrame или загрузите его как файл javascript или css.

Несколько браузеров поддерживают пользовательские методы для загрузки локального файла (и другие интересные вещи), IE имеет ActiveX и Firefox имеет XPCOM.

Ответ 2

Согласно документации Firefox, будет работать следующий код:

var req = new XMLHttpRequest();  
req.open('GET', 'file:///home/user/file.json', false);   
req.send(null);  
if(req.status == 0)  
  dump(req.responseText);

Кажется, я помню, что он работает только в том же каталоге, что и HTML-страница. И я не знаю, будет ли это работать в других браузерах.

Ответ 3

Это будет работать только в IE, но если это не проблема для вас, вот пример кода для записи в файл:

    var fso, s;
    fso = new ActiveXObject("Scripting.FileSystemObject");
    s = fso.OpenTextFile("c:\\path\\to\\myfile.txt" , 8, 1, -2);
    s.writeline("Hello World");
    s.Close();

А затем прочитать из него:

f = fso.OpenTextFile(filename, ForReading);
while (!f.AtEndOfStream) {
    var r = f.ReadLine();
    document.write (r + "<br />");
}
f.Close();

Для получения дополнительной информации о OpenTextFile, проверьте: http://msdn.microsoft.com/en-us/library/314cz14s(VS.85).aspx

Ответ 4

IF пользователь предоставляет разрешение вашей веб-страницы для доступа к этим файлам и IF, они расположены на том же компьютере, что и веб-страница, и нет ничего, что мешает вам получить Доступ только к файлам на компьютере с помощью JavaScript.

Ответ 5

Если люди должны отбросить строку json в папку, вы можете просто создать простой текстовый файл, а затем использовать вызов AJAX для имени файла, точно так же, как вы указали бы его на php/asp script. Я делаю это все время для тестирования страниц, прежде чем я сделаю бэкэнд.

т.е. если ваша страница была C:\foo\index.html, вы могли бы переместить их в C:\foo\putyourstuff\json.txt и запустить вызов AJAX "putyourstuffhere/json.txt".

Ответ 6

Вы можете читать файлы, используя только запрос Ajax, как если бы это был сервер. Но вы должны знать имя файла, и вы не можете писать файлы.

Ответ 7

Если вы создаете страницу гипертекстового приложения (.hta) вместо HTML-страницы (.htm/.html), то у вас есть полный доступ к файловой системе, используя объект FileSystemObject.

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

Ответ 8

Это сработало для меня в Firefox...

Адаптированный код с этого сайта: http://www.h-online.com/security/services/Firefox-Mozilla-Demo-Reading-local-files-via-local-HTML-files-761851.html

<HTML>

<BODY onLoad="ReadFileContent()" >

<iframe id="local_file" name="local_file" 
    src="file:///C:/test.txt"
    height=0 width=0>
</iframe>

<script>

function ReadFileContent(){

alert(local_file.document.firstChild.innerHTML);

}

</script>

<h2>Read Local File</h2>

<P>
If a window displays the content of your local file C:\test.txt
the demo worked. If no additional window appears, it failed. You can
close this window now.</p>

</body>

</html>

Ответ 9

Вам следует рассмотреть какой-то язык сценариев на стороне сервера, такой как PHP, Perl, JSP или некоторая форма SSJS.

Ответ 10

Да, хотя это небезопасно, вы можете использовать:

fopen("c:\\MyFile.txt", 'r');