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


177

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


2
Зачем тебе это? Может быть, есть обходные пути.
Ionuț G. Stan


1
раньше уже много раз спрашивали
annakata

1
Я нашел этот ресурс относительно хранения файлов на стороне клиента. html5rocks.com/en/tutorials/offline/storage Из того, что я собрал, HTML5 фактически позволяет Websights хранить информацию на локальном жестком диске пользователя, но в более похожей на базу данных усадьбе. Браузер управляет хранилищем файлов и налагает определенные ограничения, чтобы не дать Всемирной паутине загружать жесткие диски людей до краев. Они еще не полностью защищены от дурака, но их настраивают, по крайней мере, в соответствии с этой статьей. Прочитайте подробности.
Гарретт

2
Используйте Ajax и с PHP обрабатывать чтение и запись файлов. Если вы хотите обрабатывать запись в файлы на стороне клиента, вы должны забыть об этом. Для этого потребуется отключить многие параметры безопасности на сервере, и вы останетесь с крайне небезопасным сайтом. Если вы не хотите использовать PHP, возможно, то, чего вы хотите достичь, можно сделать с помощью файлов cookie JavaScript для хранения данных на клиентском компьютере.
Дэн Брей

Ответы:


64

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

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

Смотрите эту документацию по классу Javascript File.

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

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

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


3
Можно ли записывать в локальные файлы, используя HTML5?
Андерсон Грин

1
Кроме того, в зависимости от вашей ситуации вы можете сделать ajax-вызов php-скрипта и таким образом вывести данные. Это было полезно в моей ситуации, когда я хотел сохранить некоторые данные, сгенерированные на стороне javascript, но не имело значения, как они туда попали.
Дастин Грэм

1
@DustinGraham, на самом деле теперь с помощью API Chrome мы можем записывать файлы на стороне клиента через JavaScript, верно?
Pacerier

40

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


44
@marcgg: Это делает этот ответ неполным, а не неправильным. И, давайте посмотрим правде в глаза, это весьма вероятно , что этот ответ действительно охватывает случай использования в OP еще.
Гонки легкости на орбите

36
Если ОП планировал использовать javascript вне браузера, это достаточно редко, что они, вероятно, упомянули бы об этом. Это не является необоснованным (и, безусловно, не неправильно), чтобы принять браузер. +1 (чтобы восполнить -1 по Маркгу).
Майкл Мартин-Смукер

2
@LightnessRacesinOrbit Кнопка downvote не означает, что ответ считается неправильным. Его подсказка текст This answer is not useful.
Скраффи

1
@Mike - это не было, когда этот ответ был написан, и все еще разумно предположить JS на стороне браузера по умолчанию.
Квентин

16

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

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


Ссылки битые сейчас.
Прометей

Ссылки снова сломаны, они обе одинаковые, но имеют разные значения.
insidesin

@insidesin исправлено
Томас Шилдс

14

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

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

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

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

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

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


12

Эта функция 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");

1
ИК = createElement ( 'IFrame'); - iframe - это идентификатор iFrame.
Temp

Кроме того, будет ли он работать во всех операционных системах (если выбрано правильное расположение файла?)
Андерсон Грин,

4
Это хорошее решение, но работает ли оно только с IE? Я пробовал IE и FF и с FF это не работает.
u.gen

9

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

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

MSDN здесь


Я хотел сделать это в htaприложении, и это решает его
chiliNUT

8

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

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



5

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

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

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

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

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


3

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

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.


2

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


1

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

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


4
И какой именно барьер для того, чтобы стать «доверенным» приложением? Диалог подтверждения?
Бретон

@Philip, никто не сказал, что это должен быть кросс-браузер. Различное решение для каждого браузера хорошо.
Pacerier

1

Из теста 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' создает цикл!


0

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


1
Это не дает ответа на вопрос. Чтобы критиковать или запросить разъяснения у автора, оставьте комментарий под своим постом.
harpun

@harpun, точно. Пожалуйста, удалите этот ответ и преобразуйте его в комментарий.
Pacerier

0

Есть два способа чтения и записи файла с использованием JavaScript

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

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


-1

Вот решение для записи 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 / Files

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.