Bagaimana cara membaca dan menulis ke dalam file menggunakan JavaScript?

177

Adakah yang bisa memberikan kode sampel untuk membaca dan menulis file menggunakan JavaScript?

pengguna4642212
sumber
2
Mengapa Anda membutuhkannya? Mungkin ada solusi.
Ionuț G. Stan
1
telah diminta berkali-kali sebelumnya sebenarnya
annakata
1
Saya menemukan sumber ini mengenai penyimpanan file sisi klien. html5rocks.com/en/tutorials/offline/storage Dari apa yang saya kumpulkan, HTML5 sebenarnya memungkinkan Websights untuk menyimpan informasi pada hard drive lokal pengguna, tetapi dalam manor yang lebih mirip database. Peramban mengelola penyimpanan file dan menetapkan batas-batas tertentu untuk mencegah World Wide Web memuat hard drive orang hingga penuh. Mereka belum benar-benar bukti bodoh, tetapi sedang diubah, setidaknya menurut artikel ini. Baca untuk detailnya.
Garrett
2
Gunakan Ajax dan dengan PHP menangani membaca dan menulis file. Jika Anda ingin menangani penulisan ke sisi klien, Anda harus melupakannya. Dibutuhkan banyak opsi keamanan untuk dinonaktifkan di server dan Anda akan dibiarkan dengan situs yang sangat tidak aman. Jika Anda tidak ingin menggunakan PHP, mungkin apa yang ingin Anda capai dapat dilakukan dengan menggunakan JavaScript Cookies untuk menyimpan data di komputer klien.
Dan Bray

Jawaban:

64

Untuk kelengkapan, OP tidak menyatakan dia ingin melakukan ini di browser (jika dia, seperti yang telah disebutkan, umumnya tidak mungkin)

Namun javascript per se memang memungkinkan ini; itu dapat dilakukan dengan javascript sisi server.

Lihat dokumentasi ini di kelas File Javascript

Sunting : Tautan itu ke dokumen Sun yang sekarang telah dipindahkan oleh Oracle.

Untuk mengikuti perkembangannya, inilah dokumentasi node.js untuk kelas FileSystem: http://nodejs.org/docs/latest/api/fs.html

Sunting (2) : Anda dapat membaca file sisi klien sekarang dengan HTML5: http://www.html5rocks.com/en/tutorials/file/dndfiles/

DanSingerman
sumber
3
Apakah mungkin menulis ke file lokal menggunakan HTML5 juga?
Anderson Green
1
Juga, tergantung pada situasi Anda, Anda bisa membuat panggilan ajax ke skrip php dan membuang data dengan cara itu. Ini berguna dalam situasi saya di mana saya ingin menyimpan beberapa data yang dihasilkan di sisi javascript, tetapi tidak masalah bagaimana itu sampai di sana.
Dustin Graham
1
@DustinGraham, Sebenarnya sekarang dengan API Chrome kita benar - benar dapat menulis file ke sisi klien melalui JavaScript kan?
Pacerier
40

Tidak. Javascript sisi-browser tidak memiliki izin untuk menulis ke mesin klien tanpa banyak opsi keamanan yang harus dinonaktifkan

Gareth
sumber
44
@marcgg: Itu membuat jawaban ini tidak lengkap, tidak salah. Dan, mari kita hadapi itu, sangat mungkin bahwa jawaban ini tidak mencakup kasus penggunaan OP.
Lightness Races in Orbit
36
Jika OP berencana menggunakan javascript di luar browser, itu tidak biasa sehingga mereka mungkin akan menyebutkannya. Itu tidak masuk akal (dan jelas tidak salah) untuk menganggap browser. +1 (untuk mengganti marcgg's -1).
Michael Martin-Smucker
2
@LightnessRacesinOrbit Tombol downvote tidak berarti bahwa jawabannya dianggap salah. Teks tooltipnya adalah This answer is not useful.
Scruffy
1
@ Mike - Bukan saat jawaban ini ditulis, dan masih masuk akal untuk menganggap JS sisi-browser secara default.
Quentin
16

Masa depan ada di sini! Proposal mendekati penyelesaian, tidak ada lagi ActiveX atau flash atau java. Sekarang kita bisa menggunakan:

Anda bisa menggunakan Drag / Drop untuk memasukkan file ke browser, atau kontrol unggah yang sederhana. Setelah pengguna memilih file, Anda dapat membacanya dengan Javascript: http://www.html5rocks.com/en/tutorials/file/dndfiles/

Thomas Shields
sumber
Tautan rusak sekarang.
Prometheus
Tautan terputus lagi, keduanya merupakan tautan yang sama, tetapi dengan makna berbeda .. Rusak.
insidesin
@insidesin diperbaiki
Thomas Shields
14

inilah proposal mozilla

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

ini diimplementasikan dengan sakelar kompilasi dalam spidermonkey, dan juga dalam skrip extends adobe. Selain itu (saya pikir) Anda mendapatkan objek File di ekstensi firefox.

badak memiliki fungsi readFile (agak sederhana) https://developer.mozilla.org/en/Rhino_Shell

untuk operasi file yang lebih kompleks di badak, Anda dapat menggunakan metode java.io.File.

Anda tidak akan mendapatkan semua ini di browser. Untuk fungsionalitas serupa di browser Anda dapat menggunakan fungsi database SQL dari HTML5, kegigihan sisi klien, cookie, dan objek penyimpanan flash.

Breton
sumber
12

Fungsi Javascript ini menyajikan kotak dialog "Simpan Sebagai" yang lengkap untuk pengguna yang menjalankan ini melalui browser. Pengguna menekan OK dan file disimpan.

Sunting: Kode berikut hanya berfungsi dengan Browser IE sejak Firefox dan Chrome menganggap kode ini sebagai masalah keamanan dan telah memblokirnya agar tidak berfungsi.

// 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;
}

Meminta fungsi:

save_content_to_file("Hello", "C:\\test");
Temp
sumber
1
ir = createElement ('iframe'); - iframe adalah ID iFrame.
Temp
Juga, apakah ini akan berfungsi pada semua sistem operasi (selama lokasi file yang valid dipilih?)
Anderson Green
4
Ini adalah solusi yang baik tetapi, apakah hanya bekerja dengan IE? Saya mencoba IE dan FF dan dengan FF tidak berhasil.
u.gen
9

Jika Anda menggunakan JScript (Microsoft's Javascript) untuk melakukan skrip lokal menggunakan WSH (BUKAN di browser!) Anda dapat menggunakan Scripting.FileSystemObjectuntuk mengakses sistem file.

Saya pikir Anda dapat mengakses objek yang sama di IE jika Anda mematikan banyak pengaturan keamanan, tetapi itu akan menjadi ide yang sangat, sangat buruk.

MSDN di sini

Dana Robinson
sumber
Saya ingin melakukan ini dalam htaaplikasi dan itu menyelesaikannya
chiliNUT
8

Saat ini, file dapat ditulis dan dibaca dari konteks tab / jendela browser dengan File , FileWriter , dan FileSystem API, meskipun ada peringatan untuk penggunaannya (lihat bagian dari jawaban ini).

Tetapi untuk menjawab pertanyaan Anda:

Menggunakan BakedGoods *

Menulis file:

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

Baca file:

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

Menggunakan File mentah, FileWriter, dan FileSystem API

Menulis file:

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);

Baca file:

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);

Apa yang Anda minta, kan? Mungkin tidak. Dua API terakhir:

  • Saat ini hanya diterapkan di browser berbasis Chromium (Chrome & Opera)
  • Telah dikeluarkan dari jalur standar W3C, dan sampai sekarang adalah API eksklusif
  • Dapat dihapus dari browser pelaksana di masa mendatang
  • Batasi pembuatan file ke kotak pasir (lokasi di luar file tidak dapat menghasilkan efek) pada disk

Selain itu, spesifikasi FileSystem tidak mendefinisikan pedoman tentang bagaimana struktur direktori muncul di disk. Dalam browser berbasis Chromium misalnya, kotak pasir memiliki sistem file virtual (struktur direktori yang tidak perlu ada pada disk dalam bentuk yang sama ketika diakses dari dalam browser), di mana direktori dan file dibuat dengan API ditempatkan.

Jadi, meskipun Anda mungkin dapat menulis file ke sistem dengan API, mencari file tanpa API (well, tanpa FileSystem API) bisa menjadi urusan yang tidak sepele.

Jika Anda dapat mengatasi masalah / batasan ini, API ini adalah satu-satunya cara asli untuk melakukan apa yang Anda minta.

Jika Anda terbuka untuk solusi non-asli, Silverlight juga memungkinkan untuk file i / o dari kontes tab / window melalui IsolatedStorage . Namun, kode terkelola diperlukan untuk memanfaatkan fasilitas ini; solusi yang mengharuskan penulisan kode semacam itu berada di luar cakupan pertanyaan ini.

Tentu saja, solusi yang menggunakan kode terkelola pelengkap, meninggalkan satu dengan hanya Javascript untuk menulis, baik dalam lingkup pertanyaan ini;):

//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 adalah perpustakaan Javascript yang membuat antarmuka seragam yang dapat digunakan untuk melakukan operasi penyimpanan umum di semua fasilitas asli, dan beberapa fasilitas penyimpanan non-asli. Itu dikelola oleh orang ini di sini :)

Kevin
sumber
5

Dalam konteks browser, Javascript dapat MEMBACA file yang ditentukan pengguna. Lihat blog Eric Bidelman untuk detail tentang membaca file menggunakan File API. Namun, Javascript berbasis browser tidak dapat MENULIS sistem file komputer lokal tanpa menonaktifkan beberapa pengaturan keamanan karena dianggap sebagai ancaman keamanan bagi situs web mana pun untuk mengubah sistem file lokal Anda secara sewenang-wenang.

Mengatakan itu, ada beberapa cara untuk mengatasinya tergantung apa yang Anda coba lakukan:

  1. Jika itu adalah situs Anda sendiri, Anda dapat menyematkan Java Applet di halaman web. Namun, pengunjung harus menginstal Java pada mesin lokal dan akan diberitahu tentang risiko keamanan. Pengunjung harus membiarkan applet dimuat. Java Applet seperti perangkat lunak yang dapat dieksekusi yang memiliki akses lengkap ke komputer lokal.

  2. Chrome mendukung sistem file yang merupakan bagian sandbox dari sistem file lokal. Lihat halaman ini untuk detailnya. Ini memungkinkan Anda untuk menyimpan sementara hal-hal secara lokal. Namun, ini tidak didukung oleh browser lain.

  3. Jika Anda tidak terbatas pada browser, Node.js memiliki antarmuka sistem file yang lengkap. Lihat di sini untuk dokumentasi sistem filenya . Perhatikan bahwa Node.js dapat berjalan tidak hanya di server, tetapi juga komputer klien termasuk windows. Pelari uji javascript Karma didasarkan pada Node.js. Jika Anda hanya ingin memprogram dalam javascript di komputer lokal, ini merupakan opsi.

gm2008
sumber
3

Untuk membuat file coba

function makefile(){
  var fso;
  var thefile;

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

    thefile.close()
    }

Buat direktori Anda di drive C karena windows memiliki keamanan terhadap penulisan dari web misalnya membuat folder bernama "tmp" di drive C.

Ifiok Idiang
sumber
2

Anda harus beralih ke Flash, Java atau Silverlight. Dalam kasus Silverlight, Anda akan melihat Penyimpanan Terpencil . Itu akan membuat Anda menulis ke file di taman bermain Anda sendiri pada disk pengguna. Ini tidak akan membiarkan Anda menulis di luar taman bermain Anda.

Cory R. King
sumber
1

Anda tidak dapat melakukan ini dengan cara lintas browser apa pun. IE memang memiliki metode untuk mengaktifkan aplikasi "tepercaya" untuk menggunakan objek ActiveX untuk membaca / menulis file, tetapi hanya itu sayangnya.

Jika Anda ingin menyimpan informasi pengguna, kemungkinan besar Anda perlu menggunakan cookie.

Philip Reynolds
sumber
4
Dan halangan untuk menjadi aplikasi "tepercaya" adalah apa tepatnya? Dialog konfirmasi?
Breton
@ Pilip, Tidak ada yang mengatakan itu harus cross browser. Solusi yang berbeda untuk setiap browser baik-baik saja.
Pacerier
1

Dari tes ReactJS, kode berikut berhasil menulis file:

import writeJsonFile from 'write-json-file';

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

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

File tersebut ditulis ke direktori yang berisi tes, jadi menulis ke file JSON yang sebenarnya '* .json' membuat perulangan!

Steve Pitchers
sumber
0

Anda tidak dapat melakukan file i / o di sisi klien menggunakan javascript karena itu akan menjadi risiko keamanan. Anda harus membuatnya untuk mengunduh dan menjalankan exe, atau jika file ada di server Anda, gunakan AJAX dan bahasa sisi-server seperti PHP untuk melakukan i / o di sisi server

Klik Upvote
sumber
1
Ini tidak memberikan jawaban untuk pertanyaan itu. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah posting mereka.
harpun
@ Harpun, Tepat. Hapus jawaban ini dan ubah menjadi komentar.
Pacerier
0

Ada dua cara untuk membaca dan menulis file menggunakan JavaScript

  1. Menggunakan ekstensi JavaScript

  2. Menggunakan halaman web dan objek Active X

Grigor IWT
sumber
-1

Berikut ini adalah solusi tulis untuk chrome v52 + (pengguna masih harus memilih tujuan do ...)
sumber: 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()

Paling cocok untuk menulis data besar yang dihasilkan di sisi klien.
Kalau tidak saya sarankan menggunakan FileSaver.js untuk menyimpan Blob / Files

Tak berujung
sumber