Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Чтение файла на стороне клиента (https://javascript.ru/forum/css-html/60617-chtenie-fajjla-na-storone-klienta.html)

annie88 11.01.2016 13:43

Чтение файла на стороне клиента
 
Добрый день!

Не могли бы Вы мне помочь? Есть некое приложение создающее на стороне клиента файл и записывающее в него какую-то информацию.
Как можно средствами javascript эту информацию считать? Все действия должны происходить только на стороне клиента, без сохранения файла на сервере.
P.S. думала в сторону cookie и locallstorage, но не знаю может ли десктопное приложение что-то туда писать.

Dilettante_Pro 11.01.2016 15:00

annie88, считать содержимое файла на стороне клиента легко:
При помощи input type="file" выбираем файл на клиентском компьютере и через объект типа FileReader считываем его содержимое:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" >
    <title>Untitled Page</title>
    <script type="text/javascript">
         function readFile() {
           var selectedFile = document.getElementById('inputFile').files[0];
           var reader = new FileReader();
           reader.onload = function (e) {
             var FileContent = e.target.result;
			 parseContent(FileContent);
           };
           reader.readAsText(selectedFile);
	     }

         function parseContent(content) {
             alert(content);
         }
    </script>
  </head>
  <body>
     <input id="inputFile" type="file"  onchange="readFile()">
  </body>
</html>

А вот потом содержимое файла надо разобрать...

annie88 11.01.2016 15:07

Спасибо))) а можно считать файл без вывода окон? просто считывать данные со статично расположенного файла (имя его тоже известно и оно не меняется)?

Dilettante_Pro 11.01.2016 15:27

Естественно можно!
Тогда не нужен input, и в функции readFile() не нужна строка получения имени файла из input'а
var selectedFile = document.getElementById('inputFile').files[0];

Известное имя файла нужно подставить в reader.readAsText(file);
Можно передать имя файла в функцию readFile() в качестве параметра

annie88 11.01.2016 15:52

Здорово))) однако не совсем понятно как можно сформировать объект для передачи в качестве параметра в reader.readAsText?

Dilettante_Pro 11.01.2016 16:07

Цитата:

Сообщение от annie88 (Сообщение 403268)
Здорово))) однако не совсем понятно как можно сформировать объект для передачи в качестве параметра в reader.readAsText?

Какой объект? Известное имя файла? Простая символьная переменная...
например

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="X-UA-Compatible" content="IE=Edge" >
    <title>Untitled Page</title>
    <script type="text/javascript">
         function readFile(selectedFile) {
            var reader = new FileReader();
           reader.onload = function (e) {
             var FileContent = e.target.result;
             parseContent(FileContent);
           };
           reader.readAsText(selectedFile);
         }
 
         function parseContent(content) {
             alert(content);
         }
    </script>
  </head>
  <body>
     <input  type="button"  onclick="readFile('C:\Test\TestFile.txt')">
  </body>
</html>

annie88 11.01.2016 16:19

Цитата:

Сообщение от Dilettante_Pro
Какой объект? Известное имя файла? Простая символьная переменная...

selectedFile не символьная переменная, это объект

Dilettante_Pro 11.01.2016 16:24

Цитата:

Сообщение от annie88 (Сообщение 403272)
selectedFile не символьная переменная, это объект

В обоих моих примерах это ПРОСТАЯ СИМВОЛЬНАЯ ПЕРЕМЕННАЯ. (Ну, пардон, СТРОКОВАЯ в терминологии JS)
В первом примере она получает значение (символьное) из input, во втором - как параметр функции из символьной строки при вызове функции

annie88 11.01.2016 16:37

Цитата:

Сообщение от Dilettante_Pro
В обоих моих примерах это ПРОСТАЯ СИМВОЛЬНАЯ ПЕРЕМЕННАЯ.

console.log(selectedFile) вывел в firebug что-то вроде :
File { name="file.txt", lastModified=1449139811127, lastModifiedDate=Date,...}

Dilettante_Pro 11.01.2016 16:52

Да, пардон, это Blob...

annie88 11.01.2016 16:54

т.е. без диалогового окна в этом случае не обойтись?

Dilettante_Pro 11.01.2016 17:43

Похоже, работа на стороне клиента без участия человека невозможна из соображений безопасности - чтобы скрипт втихомолку не шарил по компу

Dilettante_Pro 11.01.2016 18:05

Как выясняется, читает файл именно input type="file"
FileReader только вытаскивает содержимое считанного файла.
Можно создать объект
var selectedFile = new File(["Test Content ...."], "C:\Test\TestFile.txt", {type: "text/plain"});
Но толку от этого никакого: содержание файла тоже нужно вставить в объект ( в данном примере Test Content ....

annie88 12.01.2016 06:59

Dilettante_Pro,большое спасибо)
похоже, что все же придется копать в сторону File System или Local Storage(((

Dilettante_Pro 12.01.2016 11:52

annie88,
Успехов!
Тонкостей не знаю, но, мне кажется, этот вариант работает с хранилищем, которое доступно только приложению, создавшему хранилище. Т.е. какое-либо другое приложение на локальной машине его вообще не увидит

annie88 12.01.2016 16:14

Получилось))) если создать файловую систему в браузере, то из web-приложения можно будет создавать/заполнять/читать файлы, которые будут доступны и десктопному приложению, нужно лишь задать в нем правильный путь. Данное решение, насколько я поняла, доступно пока только в chrome.

Dilettante_Pro 12.01.2016 17:57

Цитата:

Сообщение от annie88 (Сообщение 403430)
нужно лишь задать в нем правильный путь.

А какой это правильный путь? В браузере их пути относительные.

annie88 13.01.2016 08:01

Цитата:

Сообщение от Dilettante_Pro (Сообщение 403442)
А какой это правильный путь? В браузере их пути относительные.

не совсем, можно создать постоянные файлы и записывать нужные данные в них, тогда при перезагрузке браузера информация будет сохранена. Их можно найти на компьютере по пути C:\Users\имя пользователя\AppData\Local\Google\Chro me\User Data\Default\File System\смотрим каталог с последний датой изменения\(каталоги p-постоянные; t-временные)\path- находим файл с расширением log и смотрим какое имя задал компьютер нашему файлу, созданному таким образом
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem;
 window.requestFileSystem(window.TEMPORARY, 5*1024*1024, function(fs) {
  fs.root.getFile('log.txt', {create: true}, function(fileEntry) {
  }, функция_обработки_ошибки );
}, функция_обработки_ошибки);

затем идем на уровень выше (в данном случае возвращаемся в t) и находим указанный в log каталог и файл.

Dilettante_Pro 13.01.2016 10:44

annie88,
Спасибо, очень интересная информация. Плохо только, что работает только в Chrome
PS: я, кстати, искал fs на локалке по этому же пути, но ничего не нашел - не отображались скрытые файлы и папки, а копнуть поглубже не додумался...


Часовой пояс GMT +3, время: 14:37.