Как читать и записывать в файл с помощью JavaScript?

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


person Community    schedule 25.02.2009    source источник
comment
Зачем тебе это? Возможно, есть обходные пути.   -  person Ionuț G. Stan    schedule 25.02.2009
comment
обман: stackoverflow.com/questions/582268/jquery -чтение-запись-в-файл/   -  person Paolo Bergantino    schedule 25.02.2009
comment
уже много раз спрашивали на самом деле   -  person annakata    schedule 25.02.2009
comment
Я нашел этот ресурс относительно хранения файлов на стороне клиента. html5rocks.com/en/tutorials/offline/storage Из того, что я Насколько я понял, HTML5 фактически позволяет Websights хранить информацию на локальном жестком диске пользователя, но в поместье, больше похожем на базу данных. Браузер управляет хранилищем файлов и накладывает определенные ограничения, чтобы Всемирная паутина не загружала жесткие диски людей до краев. Они еще не полностью защищены от дурака, но они настраиваются, по крайней мере, согласно этой статье. Прочитайте подробности.   -  person Garrett    schedule 28.12.2016
comment
Используйте Ajax и PHP для чтения и записи файлов. Если вы хотите обрабатывать запись в файлы на стороне клиента, вы должны забыть об этом. Это потребует отключения многих параметров безопасности на сервере, и вы останетесь с крайне небезопасным сайтом. Если вы не хотите использовать PHP, возможно, то, чего вы хотите достичь, можно сделать с помощью файлов cookie JavaScript для хранения данных на клиентском компьютере.   -  person Dan Bray    schedule 14.01.2017


Ответы (17)


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

Однако 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/

person DanSingerman    schedule 25.02.2009
comment
Можно ли также писать в локальные файлы с помощью HTML5? - person Anderson Green; 03.08.2012
comment
Кроме того, в зависимости от вашей ситуации вы можете сделать ajax-вызов php-скрипта и таким образом вывести данные. Это было полезно в моей ситуации, когда я хотел сохранить некоторые данные, сгенерированные на стороне javascript, но не имел значения, как они туда попали. - person Dustin Graham; 15.01.2013
comment
@DustinGraham, на самом деле теперь с помощью API Chrome мы можем фактически записывать файлы на стороне клиента через JavaScript, верно? - person Pacerier; 27.06.2015

Нет. JavaScript на стороне браузера не имеет разрешения на запись на клиентский компьютер без необходимости отключения множества параметров безопасности.

person Gareth    schedule 25.02.2009
comment
@marcgg: это делает этот ответ неполным, а не неверным. И, скажем прямо, весьма вероятно, что этот ответ действительно охватывает вариант использования OP. - person Lightness Races in Orbit; 08.06.2011
comment
Если бы ОП планировал использовать javascript вне браузера, это было бы достаточно редко, и они, вероятно, упомянули бы об этом. Вполне разумно (и определенно правильно) предполагать наличие браузера. +1 (чтобы компенсировать marcgg's -1). - person Michael Martin-Smucker; 15.06.2011
comment
@LightnessRacesinOrbit Кнопка «против» не означает, что ответ считается неверным. Его текст всплывающей подсказки This answer is not useful. - person Scruffy; 28.11.2015
comment
@Mike - Это было не тогда, когда был написан этот ответ, и по-прежнему разумно предположить, что JS на стороне браузера по умолчанию. - person Quentin; 20.06.2016

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

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

person Thomas Shields    schedule 10.08.2011
comment
Ссылки сейчас битые. - person Prometheus; 28.06.2016
comment
Ссылки снова не работают, это одна и та же ссылка, но с разным значением. Битые. - person insidesin; 12.12.2018
comment
@insidesin исправлено - person Thomas Shields; 17.01.2019

вот предложение мозиллы

http://www-archive.mozilla.org/js/js-file-object.html

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

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

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

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

person Breton    schedule 25.02.2009

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

Изменить: следующий код работает только с браузером 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");
person Temp    schedule 24.10.2011
comment
ир = создатьЭлемент('iframe'); -- iframe - это идентификатор iFrame. - person Temp; 24.10.2011
comment
Кроме того, будет ли он работать во всех операционных системах (при условии, что выбрано правильное расположение файла?) - person Anderson Green; 03.08.2012
comment
Это хорошее решение, но работает ли оно только с IE? Пробовал IE и FF и с FF не работает. - person u.gen; 26.10.2012

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

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

MSDN здесь

person Dana Robinson    schedule 25.02.2009
comment
Я хотел сделать это в приложении hta, и это решило проблему. - person chiliNUT; 15.12.2015

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

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

Использование 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.
  • Может быть удален из реализующих браузеров в будущем.
  • Ограничить создание файлов песочницей (местом, за пределами которого файлы не могут иметь никакого эффекта) на диске.

Кроме того, спецификация файловой системы не определяет никаких указаний относительно того, как структуры каталогов должны отображаться на диске. Например, в браузерах на основе Chromium песочница имеет виртуальную файловую систему (структуру каталогов, которая не обязательно существует на диске в той же форме, что и при доступе из браузера), внутри которой размещаются каталоги и файлы, созданные с помощью 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, которая устанавливает единый интерфейс, который можно использовать для выполнения общих операций хранения во всех собственных и некоторых нестандартных хранилищах. Его поддерживает вот этот парень :) .

person Kevin    schedule 07.07.2016

Для Фаерфокса:

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, чтобы узнать, как оно это делает.

person Lindsay Morsillo    schedule 02.02.2012

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

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

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

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

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

person gm2008    schedule 12.05.2015

Чтобы создать файл, попробуйте

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.

person Ifiok Idiang    schedule 31.03.2011

Вам придется обратиться к Flash, Java или Silverlight. В случае с Silverlight вы увидите Isolated Хранение. Это позволит вам писать в файлы на вашей собственной игровой площадке на диске пользователя. Однако он не позволит вам писать за пределами вашей игровой площадки.

person Cory R. King    schedule 25.02.2009

Вы не можете сделать это каким-либо кросс-браузерным способом. В IE есть методы, позволяющие «доверенным» приложениям использовать объекты ActiveX для чтения/записи файлов, но, к сожалению, это все.

Если вы хотите сохранить информацию о пользователе, вам, скорее всего, потребуется использовать файлы cookie.

person Philip Reynolds    schedule 25.02.2009
comment
И что мешает стать доверенным приложением? Диалог подтверждения? - person Breton; 25.02.2009
comment
@Philip, никто не говорил, что это должно быть кроссбраузерным. Отличное решение для каждого браузера. - person Pacerier; 27.06.2015

Из теста ReactJS следующий код успешно записывает файл:

import writeJsonFile from 'write-json-file';

const ans = 42;
writeJsonFile('answer.txt', ans);

const json = {"answer": ans};
writeJsonFile('answer_json.txt', json);

Файл записывается в каталог, содержащий тесты, поэтому запись в реальный файл JSON «*.json» создает цикл!

person Steve Pitchers    schedule 14.11.2018

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

const data = {name: 'Ronn', age: 27};              //sample json
const a = document.createElement('a');
const blob = new Blob([JSON.stringify(data)]);
a.href = URL.createObjectURL(blob);
a.download = 'sample-profile';                     //filename to download
a.click();

Ознакомьтесь с документацией по Blob здесь — Blob MDN

person Ronn Wilder    schedule 11.08.2020

Вы не можете выполнять файловый ввод-вывод на стороне клиента с помощью javascript, так как это может быть угрозой безопасности. Вам нужно либо заставить их загрузить и запустить исполняемый файл, либо, если файл находится на вашем сервере, использовать AJAX и язык на стороне сервера, такой как PHP, для выполнения ввода-вывода на стороне сервера.

person Ali    schedule 25.02.2009
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его публикацией. - person harpun; 13.11.2013
comment
@harpun, Точно. Пожалуйста, удалите этот ответ и превратите его в комментарий. - person Pacerier; 27.06.2015

Существует два способа чтения и записи файла с помощью JavaScript.

  1. Использование расширений JavaScript

  2. Использование веб-страницы и объектов Active X

person GrigorAtaryan    schedule 14.11.2018

Вот решение для записи для chrome v52+ (пользователю все еще нужно выбрать целевую доу...)
источник: StreamSaver.js

<!-- load StreamSaver.js before streams polyfill to detect support -->
<script src="StreamSaver.js"></script>
<script src="https://wzrd.in/standalone/web-streams-polyfill@latest"></script>
const writeStream = streamSaver.createWriteStream('filename.txt')
const encoder = new TextEncoder
let data = 'a'.repeat(1024)
let uint8array = encoder.encode(data + "\n\n")

writeStream.write(uint8array) // must be uInt8array
writeStream.close()

Лучше всего подходит для записи больших данных, сгенерированных на стороне клиента.
В противном случае я предлагаю использовать FileSaver.js для сохранения BLOB-объектов/файлов

person Endless    schedule 11.06.2016