จะอ่านและเขียนไฟล์โดยใช้ JavaScript ได้อย่างไร?


177

ใครสามารถให้รหัสตัวอย่างในการอ่านและเขียนไฟล์โดยใช้ JavaScript?


2
ทำไมคุณต้องการมัน อาจจะมีวิธีแก้ปัญหา
Ionuț G. Stan


1
ได้รับการถามหลายครั้งก่อนจริง
annakata

1
ฉันพบทรัพยากรนี้เกี่ยวกับการจัดเก็บไฟล์ฝั่งไคลเอ็นต์ html5rocks.com/th/tutorials/offline/storageจากสิ่งที่ฉันรวบรวมมาจริง ๆ แล้ว HTML5 อนุญาตให้ Websights จัดเก็บข้อมูลบนฮาร์ดไดรฟ์ในเครื่องของผู้ใช้ แต่ในคฤหาสน์เหมือนฐานข้อมูล เบราว์เซอร์จัดการที่เก็บไฟล์และกำหนดข้อ จำกัด บางอย่างเพื่อป้องกันไม่ให้เวิลด์ไวด์เว็บโหลดฮาร์ดไดรฟ์ของผู้คนลงสู่ขอบ พวกเขายังไม่ได้พิสูจน์ได้อย่างสมบูรณ์ แต่พวกเขากำลังถูกปรับแต่งอย่างน้อยตามบทความนี้ อ่านรายละเอียด
Garrett

2
ใช้ Ajax และด้วย PHP จัดการอ่านและเขียนไฟล์ หากคุณต้องการจัดการกับการเขียนไปยังฝั่งไคลเอ็นต์ไฟล์คุณควรลืมมัน มันจะต้องมีตัวเลือกความปลอดภัยจำนวนมากที่จะปิดการใช้งานบนเซิร์ฟเวอร์และคุณจะถูกทิ้งไว้กับเว็บไซต์ที่ไม่ปลอดภัยอย่างยิ่ง หากคุณไม่ต้องการใช้ PHP คุณสามารถทำได้โดยใช้ JavaScript คุกกี้เพื่อเก็บข้อมูลบนคอมพิวเตอร์ไคลเอนต์
Dan Bray

คำตอบ:


64

เพื่อความสมบูรณ์ OP ไม่ได้ระบุว่าเขาต้องการทำสิ่งนี้ในเบราว์เซอร์ (ถ้าเป็นตามที่ระบุไว้โดยทั่วไปไม่สามารถทำได้)

อย่างไรก็ตามจาวาสคริปต์ต่อ se อนุญาตนี้; มันสามารถทำได้ด้วยจาวาสคริปต์ฝั่งเซิร์ฟเวอร์

ดูเอกสารนี้ในคลาสไฟล์ Javascript

แก้ไข : ลิงค์นั้นไปยังเอกสาร 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 เช่นกัน?
Anderson Green

1
นอกจากนี้ขึ้นอยู่กับสถานการณ์ของคุณคุณสามารถโทร ajax กับสคริปต์ php และถ่ายโอนข้อมูลด้วยวิธีดังกล่าว สิ่งนี้มีประโยชน์ในสถานการณ์ของฉันที่ฉันต้องการเก็บข้อมูลบางอย่างที่สร้างขึ้นในด้านจาวาสคริปต์ แต่ไม่สำคัญว่าจะไปถึงที่นั่นได้อย่างไร
ดัสตินเกรแฮม

1
@DustinGraham จริง ๆ แล้วตอนนี้ด้วย Chrome APIs เราสามารถเขียนไฟล์ไปยังฝั่งไคลเอ็นต์ผ่าน JavaScript ได้ไหม?
Pacerier

40

ไม่จาวาสคริปต์ทางเบราว์เซอร์ไม่ได้รับอนุญาตให้เขียนลงในเครื่องไคลเอนต์โดยไม่มีตัวเลือกความปลอดภัยจำนวนมากที่ต้องถูกปิดใช้งาน


44
@marcgg: นั่นทำให้คำตอบนี้ไม่สมบูรณ์ไม่ถูกต้อง และถ้าอย่างนั้นเราก็มีความเป็นไปได้สูงที่คำตอบนี้จะครอบคลุมกรณีการใช้งานของ OP
การแข่งขัน Lightness ใน Orbit

36
หาก OP กำลังวางแผนที่จะใช้งานจาวาสคริปต์นอกเบราว์เซอร์นั่นเป็นเรื่องแปลกที่พวกเขาอาจจะกล่าวถึง มันไม่ได้ไม่มีเหตุผล (และไม่ถูกต้องอย่างแน่นอน) เพื่อรับเบราว์เซอร์ +1 (เพื่อชดเชยสำหรับ marcgg's -1)
Michael Martin-Smucker

2
@LightnessRacesinOrbit ปุ่ม downvote ไม่ได้หมายความว่าคำตอบนั้นคิดว่าไม่ถูกต้อง This answer is not usefulข้อความคำแนะนำเครื่องมือของมันคือ
Scruffy

1
@Mike - ไม่ใช่เมื่อเขียนคำตอบนี้และยังมีเหตุผลที่จะถือว่า JS ฝั่งเบราว์เซอร์เป็นค่าเริ่มต้น
เควนติน

16

อนาคตอยู่ที่นี่! ข้อเสนอใกล้จะเสร็จสมบูรณ์ไม่มี ActiveX หรือแฟลชหรือจาวาอีกต่อไป ตอนนี้เราสามารถใช้:

คุณสามารถใช้ลาก / วางเพื่อนำไฟล์ไปไว้ในเบราว์เซอร์หรือควบคุมการอัปโหลดอย่างง่าย เมื่อผู้ใช้เลือกไฟล์แล้วคุณสามารถอ่านได้ด้วย Javascript: http://www.html5rocks.com/th/tutorials/file/dndfiles/


ลิงค์เสีย
โพร

ลิงก์เสียอีกทั้งมันเป็นลิงค์เดียวกัน แต่มีความหมายต่างกัน .. ใช้ไม่ได้
insidesin

แก้ไข @insidesin แล้ว
Thomas Shields

14

นี่คือข้อเสนอโมซิลล่า

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

สิ่งนี้ถูกนำมาใช้กับสวิตช์รวบรวมใน spidermonkey และใน adobe extendscript นอกจากนี้ (ฉันคิดว่า) คุณจะได้รับวัตถุไฟล์ในส่วนขยายของ Firefox

แรดมีฟังก์ชั่น readFile (ค่อนข้างหยาบคาย) https://developer.mozilla.org/en/Rhino_Shell

สำหรับการดำเนินงานไฟล์ที่ซับซ้อนมากขึ้นในแรดคุณสามารถใช้วิธี java.io.File

คุณจะไม่ได้รับสิ่งนี้ในเบราว์เซอร์ สำหรับฟังก์ชั่นที่คล้ายกันในเบราว์เซอร์คุณสามารถใช้ฟังก์ชั่นฐานข้อมูล SQL จาก HTML5 การคงอยู่ของลูกค้าคุกกี้และวัตถุที่จัดเก็บแฟลช


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
ir = createElement ( 'iframe'); - iframe คือ iFrame ID
อุณหภูมิ

นอกจากนี้ยังใช้งานได้กับทุกระบบปฏิบัติการ (ตราบเท่าที่เลือกตำแหน่งไฟล์ที่ถูกต้องหรือไม่)
Anderson Green

4
นี่เป็นวิธีแก้ปัญหาที่ดี แต่ใช้งานได้กับ IE เท่านั้นหรือไม่ ฉันพยายาม IE และ FF และด้วย FF มันไม่ทำงาน
u.gen

9

หากคุณกำลังใช้ JScript (Javascript ของ Microsoft) เพื่อทำสคริปต์ท้องถิ่นโดยใช้ WSH (ไม่ใช่ในเบราว์เซอร์!) คุณสามารถใช้ Scripting.FileSystemObjectเพื่อเข้าถึงระบบไฟล์

ฉันคิดว่าคุณสามารถเข้าถึงวัตถุเดียวกันนั้นใน IE ได้หากคุณปิดการตั้งค่าความปลอดภัยจำนวนมาก แต่นั่นเป็นความคิดที่แย่มาก ๆ

MSDN ที่นี่


ฉันต้องการทำสิ่งนี้ในhtaแอปพลิเคชันและแก้ปัญหาได้
chiliNUT

8

ขณะนี้ไฟล์สามารถเขียนและอ่านได้จากบริบทของแท็บ / หน้าต่างเบราว์เซอร์ด้วยFile , FileWriterและFileSystem APIs แม้ว่าจะมีข้อควรระวังในการใช้งาน (ดูส่วนท้ายของคำตอบนี้)

แต่เพื่อตอบคำถามของคุณ:

ใช้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){}
});

การใช้ไฟล์ raw, FileWriter และ FileSystem API

เขียนไฟล์:

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

สิ่งที่คุณขอใช่ไหม อาจจะอาจจะไม่. APIs สองรายการหลัง:

  • ปัจจุบันมีการใช้งานในเบราว์เซอร์ที่ใช้ Chromium เท่านั้น (Chrome & Opera)
  • ถูกนำออกจากแทร็กมาตรฐาน W3C และ ณ ขณะนี้เป็น API ที่เป็นกรรมสิทธิ์
  • อาจถูกลบออกจากเบราว์เซอร์ที่ใช้งานในอนาคต
  • จำกัด การสร้างไฟล์ไปยังแซนด์บ็อกซ์ (ตำแหน่งภายนอกซึ่งไฟล์ไม่สามารถสร้างผลกระทบ) บนดิสก์

นอกจากนี้ข้อมูลจำเพาะของ FileSystem ยังไม่ได้กำหนดแนวทางในการที่โครงสร้างไดเรกทอรีจะปรากฏบนดิสก์ ในเบราว์เซอร์ที่ใช้ Chromium แซนด์บ็อกซ์มีระบบไฟล์เสมือน (โครงสร้างไดเรกทอรีซึ่งไม่จำเป็นต้องมีอยู่ในดิสก์ในรูปแบบเดียวกับที่มันทำเมื่อเข้าถึงจากภายในเบราว์เซอร์) ซึ่งมีไดเรกทอรีและไฟล์ที่สร้างขึ้นด้วย มีการวาง API

ดังนั้นแม้ว่าคุณอาจจะสามารถเขียนไฟล์ไปยังระบบที่มี API ได้ แต่การค้นหาไฟล์ที่ไม่มี API (อาจจะไม่มี FileSystem API) อาจเป็นเรื่องที่ไม่สำคัญ

หากคุณสามารถจัดการกับปัญหา / ข้อ จำกัด เหล่านี้ได้ API เหล่านี้เป็นวิธีเดียวในการทำสิ่งที่คุณถาม

หากคุณกำลังเปิดเพื่อแก้ปัญหาที่ไม่ใช่เจ้าของภาษา Silverlight ยังช่วยให้ไฟล์ I / O จากการประกวดแท็บ / หน้าต่างผ่าน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 สามารถอ่านไฟล์ที่ผู้ใช้ระบุ ดูบล็อกของ Eric Bidelmanสำหรับรายละเอียดเกี่ยวกับการอ่านไฟล์โดยใช้ File API อย่างไรก็ตามมันเป็นไปไม่ได้ที่ Javascript บนเบราว์เซอร์จะเขียนระบบไฟล์ของเครื่องคอมพิวเตอร์โดยไม่ต้องปิดการใช้งานการตั้งค่าความปลอดภัยเพราะถือเป็นภัยคุกคามด้านความปลอดภัยสำหรับเว็บไซต์ใด ๆ ที่จะเปลี่ยนระบบไฟล์ภายในเครื่องของคุณเอง

การพูดว่ามีวิธีการแก้ไขโดยขึ้นอยู่กับสิ่งที่คุณพยายามทำ:

  1. หากเป็นเว็บไซต์ของคุณเองคุณสามารถฝัง Java Applet ในหน้าเว็บ อย่างไรก็ตามผู้เข้าชมจะต้องติดตั้ง Java บนเครื่องท้องถิ่นและจะได้รับการแจ้งเตือนเกี่ยวกับความเสี่ยงด้านความปลอดภัย ผู้เยี่ยมชมจะต้องอนุญาตให้โหลดแอปเพล็ต Java Applet เปรียบเสมือนซอฟต์แวร์ที่สามารถใช้งานได้ซึ่งมีการเข้าถึงคอมพิวเตอร์ในพื้นที่ได้อย่างสมบูรณ์

  2. Chrome สนับสนุนระบบไฟล์ซึ่งเป็นส่วนที่ถูกแซนด์บ็อกซ์ของระบบไฟล์ในเครื่อง ดูหน้านี้สำหรับรายละเอียด สิ่งนี้ช่วยให้คุณสามารถบันทึกสิ่งต่างๆในพื้นที่ได้ชั่วคราว อย่างไรก็ตามเบราว์เซอร์อื่นนี้ไม่รองรับ

  3. หากคุณไม่ จำกัด เบราว์เซอร์ Node.js จะมีส่วนต่อประสานระบบไฟล์ที่สมบูรณ์ ดูที่นี่สำหรับเอกสารของระบบไฟล์ โปรดทราบว่า Node.js สามารถทำงานได้ไม่เพียงบนเซิร์ฟเวอร์ แต่ยังรวมถึงคอมพิวเตอร์ไคลเอนต์ใด ๆ รวมถึงหน้าต่างด้วย นักวิ่งทดสอบ 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 ที่คุณจะมองหาที่จัดเก็บแยก ที่จะให้คุณเขียนไฟล์ในสนามเด็กเล่นของคุณเองบนดิสก์ผู้ใช้ มันจะไม่ยอมให้คุณเขียนนอกสนามเด็กเล่นของคุณ


1

คุณไม่สามารถทำได้ด้วยวิธีข้ามเบราว์เซอร์ IE มีวิธีการเปิดใช้งานแอปพลิเคชั่น "ที่เชื่อถือได้" เพื่อใช้วัตถุ ActiveX เพื่ออ่าน / เขียนไฟล์ แต่มันน่าเสียดาย

หากคุณต้องการบันทึกข้อมูลผู้ใช้คุณจะต้องใช้คุกกี้เป็นส่วนใหญ่


4
และอุปสรรคในการกลายเป็นแอปพลิเคชั่น "ที่เชื่อถือได้" คืออะไรอย่างแม่นยำ? บทสนทนายืนยัน?
Breton

@ ฟิลิปไม่มีใครบอกว่ามันต้องเป็นเบราว์เซอร์ข้าม โซลูชันที่แตกต่างกันสำหรับแต่ละเบราว์เซอร์นั้นใช้ได้
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

คุณไม่สามารถทำไฟล์ i / o ทางฝั่งไคลเอ็นต์โดยใช้ javascript เนื่องจากอาจมีความเสี่ยงด้านความปลอดภัย คุณต้องดาวน์โหลดและเรียกใช้ exe หรือหากไฟล์อยู่บนเซิร์ฟเวอร์ของคุณให้ใช้ AJAX และภาษาฝั่งเซิร์ฟเวอร์เช่น PHP เพื่อทำ i / o บนเซิร์ฟเวอร์


1
สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม หากต้องการวิจารณ์หรือขอคำชี้แจงจากผู้แต่งโปรดแสดงความคิดเห็นใต้โพสต์ของพวกเขา
harpun

@harpun แน่นอน โปรดลบคำตอบนี้และแปลงเป็นความคิดเห็น
Pacerier

0

มีสองวิธีในการอ่านและเขียนไฟล์โดยใช้ JavaScript

  1. ใช้ส่วนขยาย JavaScript

  2. การใช้เว็บเพจและวัตถุ 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.