Как читать и записывать в файл с помощью JavaScript? - PullRequest
165 голосов
/ 25 февраля 2009

Кто-нибудь может дать пример кода для чтения и записи файла с использованием JavaScript?

Ответы [ 16 ]

60 голосов
/ 25 февраля 2009

Для полноты, ОП не заявляет, что он собирается сделать это в браузере (если он, как уже было сказано, это обычно невозможно)

Однако javascript сам по себе позволяет это; это можно сделать с помощью javascript на стороне сервера.

См. Эту документацию по классу файлов Javascript

Редактировать : Эта ссылка была на документы Sun, которые теперь были перемещены Oracle.

Чтобы идти в ногу со временем, приведена документация по node.js для класса FileSystem: http://nodejs.org/docs/latest/api/fs.html

Редактировать (2) : Теперь вы можете читать файлы на стороне клиента с помощью HTML5: http://www.html5rocks.com/en/tutorials/file/dndfiles/

36 голосов
/ 25 февраля 2009

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

15 голосов
/ 10 августа 2011

Будущее уже здесь! Предложения ближе к завершению, больше нет ActiveX или флэш или Java. Теперь мы можем использовать:

Вы можете использовать перетаскивание, чтобы загрузить файл в браузер, или простой элемент управления загрузкой. Как только пользователь выбрал файл, вы можете прочитать его с помощью Javascript: http://www.html5rocks.com/en/tutorials/file/dndfiles/

14 голосов
/ 25 февраля 2009

вот предложение Mozilla

http://www -archive.mozilla.org / JS / JS-файлов object.html

это реализовано с помощью переключателя компиляции в spidermonkey, а также в расширенном скрипте Adobe. Дополнительно (я думаю) вы получаете объект File в расширениях Firefox.

Rhino имеет (довольно рудиментарную) функцию readFile https://developer.mozilla.org/en/Rhino_Shell

для более сложных файловых операций в Rhino, вы можете использовать методы java.io.File.

вы не получите ничего подобного в браузере. Для аналогичной функциональности в браузере вы можете использовать функции базы данных SQL из HTML5, клиентские персистентные файлы, файлы cookie и объекты флэш-памяти.

11 голосов
/ 24 октября 2011

Эта функция Javascript представляет полное диалоговое окно «Сохранить как» пользователю, который запускает это через браузер. Пользователь нажимает ОК, и файл сохраняется.

Редактировать: следующий код работает только с браузером IE, поскольку Firefox и Chrome сочли этот код проблемой безопасности и заблокировали его работу.

// content is the data you'll write to file<br/>
// filename is the filename<br/>
// what I did is use iFrame as a buffer, fill it up with text
function save_content_to_file(content, filename)
{
    var dlg = false;
    with(document){
     ir=createElement('iframe');
     ir.id='ifr';
     ir.location='about.blank';
     ir.style.display='none';
     body.appendChild(ir);
      with(getElementById('ifr').contentWindow.document){
           open("text/plain", "replace");
           charset = "utf-8";
           write(content);
           close();
           document.charset = "utf-8";
           dlg = execCommand('SaveAs', false, filename+'.txt');
       }
       body.removeChild(ir);
     }
    return dlg;
}

Вызов функции:

save_content_to_file("Hello", "C:\\test");
8 голосов
/ 25 февраля 2009

Если вы используете JScript (Javascript от Microsoft) для выполнения локальных сценариев с использованием WSH (НЕ в браузере!), Вы можете использовать Scripting.FileSystemObject для доступа к файловой системе.

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

MSDN здесь

7 голосов
/ 03 февраля 2012

Для Firefox:

var file = Components.classes["@mozilla.org/file/local;1"].
       createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("/home");

См. https://developer.mozilla.org/en-US/docs/Code_snippets/File_I_O

Для других, посмотрите приложение TiddlyWiki , чтобы увидеть, как оно это делает.

5 голосов
/ 07 июля 2016

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

Но чтобы ответить на ваш вопрос:

Использование BakedGoods *

Записать файл:

bakedGoods.set({
    data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
    storageTypes: ["fileSystem"],
    options: {fileSystem:{storageType: Window.PERSISTENT}},
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

Чтение файла:

bakedGoods.get({
        data: ["testFile"],
        storageTypes: ["fileSystem"],
        options: {fileSystem:{storageType: Window.PERSISTENT}},
        complete: function(resultDataObj, byStorageTypeErrorObj){}
});

Использование необработанных API-интерфейсов File, FileWriter и FileSystem

Записать файл:

function onQuotaRequestSuccess(grantedQuota)
{

    function saveFile(directoryEntry)
    {

        function createFileWriter(fileEntry)
        {

            function write(fileWriter)
            {
                var dataBlob = new Blob(["Hello world!"], {type: "text/plain"});
                fileWriter.write(dataBlob);              
            }

            fileEntry.createWriter(write);
        }

        directoryEntry.getFile(
            "testFile", 
            {create: true, exclusive: true},
            createFileWriter
        );
    }

    requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile);
}

var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);

Считать файл:

function onQuotaRequestSuccess(grantedQuota)
{

    function getfile(directoryEntry)
    {

        function readFile(fileEntry)
        {

            function read(file)
            {
                var fileReader = new FileReader();

                fileReader.onload = function(){var fileData = fileReader.result};
                fileReader.readAsText(file);             
            }

            fileEntry.file(read);
        }

        directoryEntry.getFile(
            "testFile", 
            {create: false},
            readFile
        );
    }

    requestFileSystem(Window.PERSISTENT, grantedQuota, getFile);
}

var desiredQuota = 1024 * 1024 * 1024;
var quotaManagementObj = navigator.webkitPersistentStorage;
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess);

Только то, что вы просили правильно? Может быть, а может и нет. Последние два API:

  • В настоящее время реализованы только в браузерах на базе Chromium (Chrome & Opera)
  • Удалены из стандартов W3C, и на данный момент являются проприетарными API
  • Может быть удалено из реализующих браузеров в будущем
  • Ограничить создание файлов в песочнице (место, вне которого файлы не могут оказать никакого эффекта) на диске

Кроме того, в спецификации FileSystem нет указаний о том, как структуры каталогов должны отображаться на диске. Например, в браузерах на основе Chrom в изолированной программной среде есть виртуальная файловая система (структура каталогов, которая не обязательно существует на диске в той же форме, что и при доступе из браузера), в которой каталоги и файлы, созданные с помощью API, помещаются.

Таким образом, хотя вы можете записывать файлы в систему с помощью API, поиск файлов без API (ну, без API FileSystem) может быть нетривиальным делом.

Если вы можете справиться с этими проблемами / ограничениями, эти API-интерфейсы являются практически единственным родным способом сделать то, что вы просили.

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

Конечно, решение, которое использует дополнительный управляемый код, оставляя для написания только Javascript, вполне в рамках этого вопроса;):

//Write file to first of either FileSystem or IsolatedStorage
bakedGoods.set({
    data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
    storageTypes: ["fileSystem", "silverlight"],
    options: {fileSystem:{storageType: Window.PERSISTENT}},
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

* BakedGoods - это библиотека Javascript, которая устанавливает единый интерфейс, который можно использовать для выполнения общих операций хранения во всех собственных и некоторых не собственных средствах хранения. Это поддерживается этим парнем прямо здесь:).

4 голосов
/ 12 мая 2015

В контексте браузера Javascript может ПРОЧИТАТЬ указанный пользователем файл. См. блог Эрика Бидельмана для получения подробной информации о чтении файла с помощью File API. Однако Javascript на основе браузера не может ЗАПИСАТЬ файловую систему локального компьютера, не отключив некоторые параметры безопасности, поскольку это расценивается как угроза безопасности для любого веб-сайта, который может произвольно изменить вашу локальную файловую систему.

Сказав это, есть несколько способов обойти это в зависимости от того, что вы пытаетесь сделать:

  1. Если это ваш собственный сайт, вы можете встроить Java-апплет в веб-страницу. Тем не менее, посетитель должен установить Java на локальном компьютере и будет предупрежден об угрозе безопасности. Посетитель должен разрешить загрузку апплета. Апплет Java похож на исполняемое программное обеспечение, которое имеет полный доступ к локальному компьютеру.

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

  3. Если вы не ограничены браузером, Node.js имеет полный интерфейс файловой системы. Смотрите здесь документацию по файловой системе . Обратите внимание, что Node.js может работать не только на серверах, но и на любом клиентском компьютере, включая Windows. Бегущий по тестам javascript Карма основан на Node.js. Если вы просто любите программировать в javascript на локальном компьютере, это опция.

2 голосов
/ 31 марта 2011

Для создания файла попробуйте

function makefile(){
  var fso;
  var thefile;

    fso = new ActiveXObject("Scripting.FileSystemObject");
    thefile=fso.CreateTextFile("C:\\tmp\\MyFile.txt",true);

    thefile.close()
    }

Создайте свой каталог на диске C, потому что в Windows есть защита от записи из Интернета. например, создать папку с именем «tmp» на диске C.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...