Доступ к локальным файлам с локальным 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');