Як читати та записувати у файл за допомогою JavaScript?


177

Чи може хтось дати якийсь зразок коду для читання та запису файлу за допомогою JavaScript?


2
Навіщо вам це потрібно? Можливо, є обхідні шляхи.
Ionuț G. Stan


1
його вже багато разів запитували раніше
annakata

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

2
Використовуйте Ajax та з PHP обробляйте читання та запис файлів. Якщо ви хочете обробляти запис на стороні файлів клієнта, вам слід забути про це. Було б потрібно відключити багато варіантів захисту на сервері, і ви залишили б дуже небезпечний сайт. Якщо ви не хочете використовувати PHP, можливо, те, що ви хочете досягти, можна зробити за допомогою файлів cookie JavaScript для зберігання даних на комп'ютері клієнтів.
Dan Bray

Відповіді:


64

Для повноти ОП не заявляє, що він хоче це зробити в браузері (якщо він, як було зазначено, це взагалі неможливо)

Однак 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: Це робить цю відповідь неповною, не неправильною. І, визнаймо, велика ймовірність, що ця відповідь стосується випадку використання ОП.
Гонки легкості по орбіті

36
Якби ОП планувала використовувати JavaScript за межами браузера, це досить рідко, що вони, напевно, згадували б про це. Припустити браузер не є нерозумним (і, безумовно, невірним). +1 (для компенсації -1).
Майкл Мартін-Смукер

2
@LightnessRacesinOrbit Кнопка downvote не означає, що відповідь вважається неправильною. Текст підказки є This answer is not useful.
Скруфі

1
@Mike - Не було тоді, коли ця відповідь була написана, і все-таки розумно вважати JS на стороні браузера за замовчуванням.
Квентін

16

Майбутнє тут! Пропозиції ближче до завершення, не більше ActiveX, flash або java. Тепер ми можемо використовувати:

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


Зараз посилання порушені.
Прометей

Посилання знову розриваються, вони обидва того ж посилання, але з різним значенням.
всередині

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

14

ось пропозиція мозіла

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

це реалізовано за допомогою перемикача компіляції у spidermonkey, а також у розширеному сценарії adobe. Крім того (я думаю) ви отримуєте об'єкт File у розширеннях firefox.

Носоріг має (досить рудиментарну) функцію readFile https://developer.mozilla.org/en/Rhino_Shell

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

ви не отримаєте жодного з цих матеріалів у браузері. Для подібної функціональності в браузері можна використовувати функції бази даних SQL з HTML5, постійність клієнтів, файли cookie та об'єкти зберігання флеш-пам’яті.


12

Ця функція 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");

1
ir = createElement ('iframe'); - iframe - ідентифікатор iFrame.
Темп

Також, чи буде вона працювати у всіх операційних системах (доки буде обрано дійсне розташування файлу?)
Anderson Green

4
Це хороше рішення, але чи працює він лише з IE? Я спробував IE і FF і з FF це не працює.
u.gen

9

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

Я думаю, ви можете отримати доступ до цього самого об’єкта в IE, якщо вимкнути багато параметрів безпеки, але це було б дуже, дуже поганою ідеєю.

MSDN тут


Я хотів це зробити в htaдодатку, і це вирішує
chiliNUT

8

В даний час файли можна записувати та читати з контексту вкладки / вікна браузера за допомогою 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, 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:

  • Наразі впроваджуються лише в браузерах на базі хрому (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 на локальній машині та отримає попередження про ризик безпеки. Відвідувач повинен дозволити завантажувати аплет. Яблучний аплет - це як виконуване програмне забезпечення, яке має повний доступ до локального комп'ютера.

  2. Chrome підтримує файлову систему, яка є частиною пісочного файлу локальної файлової системи. Детальну інформацію див. На цій сторінці . Це дає змогу тимчасово зберігати речі на місцях. Однак це не підтримується іншими браузерами.

  3. Якщо ви не обмежені браузером, Node.js має повний інтерфейс файлової системи. Дивіться тут його документацію на файлову систему . Зауважте, що Node.js може працювати не тільки на серверах, але і на будь-якому клієнтському комп'ютері, включаючи Windows. Тест-біг Javascript Karma заснований на 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 ви будете дивитись на Isolated Storage . Це дозволить вам записати файли на власному майданчику на диску користувачів. Це не дозволить вам писати поза межами своєї ігрової площадки.


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.