Làm thế nào để đọc và ghi vào tệp bằng JavaScript?


177

Bất cứ ai cũng có thể đưa ra một số mã mẫu để đọc và viết một tệp bằng JavaScript?


2
Tại sao bạn cần nó? Có thể có cách giải quyết.
Ionuț G. Stan


1
đã được hỏi nhiều lần trước khi thực tế
annakata

1
Tôi tìm thấy tài nguyên này liên quan đến lưu trữ tập tin phía khách hàng. html5rocks.com/en/tutorials/offline/st Storage Từ những gì tôi đã thu thập được, HTML5 thực sự cho phép Websights lưu trữ thông tin trên ổ cứng cục bộ của người dùng, nhưng trong một trang viên giống như cơ sở dữ liệu hơn. Trình duyệt quản lý lưu trữ tệp và áp đặt các giới hạn nhất định để ngăn World Wide Web tải các ổ đĩa cứng của mọi người xuống vành. Họ chưa hoàn toàn đánh lừa bằng chứng, nhưng họ đang bị điều chỉnh, ít nhất là theo bài viết này. Có một đọc để biết chi tiết.
Garrett

2
Sử dụng Ajax và với PHP xử lý việc đọc và ghi tệp. Nếu bạn muốn xử lý ghi vào phía máy khách, bạn nên quên nó đi. Nó sẽ yêu cầu nhiều tùy chọn bảo mật bị vô hiệu hóa trên máy chủ và bạn sẽ bị bỏ lại với một trang web cực kỳ không an toàn. Nếu bạn không muốn sử dụng PHP, có thể những gì bạn muốn đạt được có thể được thực hiện bằng cách sử dụng JavaScript Cookies để lưu trữ dữ liệu trên máy khách.
Dan Bray

Câu trả lời:


64

Để đầy đủ, OP không nói rằng anh ta đang tìm cách làm điều này trong một trình duyệt (nếu anh ta, như đã nêu, nói chung là không thể)

Tuy nhiên javascript per se không cho phép điều này; nó có thể được thực hiện với javascript phía máy chủ.

Xem tài liệu này trên lớp Tệp Javascript

Chỉnh sửa : Liên kết đó là các tài liệu Mặt trời đã được Oracle chuyển đi.

Để theo kịp thời gian ở đây, tài liệu node.js cho lớp FileSystem: http://nodejs.org/docs/latest/api/fs.html

Chỉnh sửa (2) : Bạn có thể đọc tệp phía máy khách ngay bây giờ với HTML5: http://www.html5rocks.com/en/tutorials/file/dndfiles/


3
Có thể ghi vào các tệp cục bộ bằng HTML5 không?
Anderson Green

1
Ngoài ra, tùy thuộc vào tình huống của bạn, bạn có thể thực hiện cuộc gọi ajax tới tập lệnh php và kết xuất dữ liệu theo cách đó. Điều này rất hữu ích trong trường hợp tôi muốn lưu trữ một số dữ liệu được tạo ở phía javascript, nhưng không quan trọng bằng cách nào nó đến đó.
Dustin Graham

1
@DustinGraham, Thực tế bây giờ với API Chrome chúng ta thực sự có thể ghi tệp cho phía khách hàng thông qua JavaScript phải không?
Pacerier

40

Không. Javascript phía trình duyệt không có quyền ghi vào máy khách mà không có nhiều tùy chọn bảo mật phải bị vô hiệu hóa


44
@marcgg: Điều đó làm cho câu trả lời này không đầy đủ, không sai. Và, hãy đối mặt với nó, rất có thể câu trả lời này không bao gồm trường hợp sử dụng của OP.
Các cuộc đua nhẹ nhàng trong quỹ đạo

36
Nếu OP dự định sử dụng javascript bên ngoài trình duyệt, điều đó không phổ biến đến mức họ có thể đã đề cập đến nó. Nó không phải là không hợp lý (và chắc chắn không phải là không chính xác) để giả sử một trình duyệt. +1 (để bù cho -1 của marcgg).
Michael Martin-Smucker

2
@LightnessRacesinOrbit Nút downvote không có nghĩa là câu trả lời được cho là không chính xác. Văn bản tooltip của nó là This answer is not useful.
Scruffy

1
@Mike - Không phải là khi câu trả lời này được viết, và vẫn hợp lý khi giả định JS phía trình duyệt theo mặc định.
Quentin

16

Tương lai là đây! Các đề xuất gần hoàn thành hơn, không còn ActiveX hay flash hay java. Bây giờ chúng ta có thể sử dụng:

Bạn có thể sử dụng Kéo / Thả để đưa tệp vào trình duyệt hoặc điều khiển tải lên đơn giản. Khi người dùng đã chọn một tệp, bạn có thể đọc nó w / Javascript: http://www.html5rocks.com/en/tutorials/file/dndfiles/


Liên kết bị hỏng bây giờ.
Prometheus

Liên kết bị phá vỡ một lần nữa, cả hai đều là cùng một liên kết, nhưng với ý nghĩa khác nhau .. Bị hỏng.
bên trong

@insidesin đã được sửa
Thomas Shields

14

đây là đề xuất mozilla

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

điều này được thực hiện với một công tắc biên dịch trong spidermonkey, và cả trong phần mở rộng của adobe. Ngoài ra (tôi nghĩ) bạn có được đối tượng Tệp trong phần mở rộng firefox.

tê giác có chức năng readFile (khá thô sơ) https://developer.mozilla.org/en/Rhino_Shell

Đối với các hoạt động tệp phức tạp hơn trong tê giác, bạn có thể sử dụng các phương thức java.io.File.

bạn sẽ không nhận được bất cứ thứ gì trong trình duyệt này. Đối với chức năng tương tự trong trình duyệt, bạn có thể sử dụng các chức năng cơ sở dữ liệu SQL từ HTML5, tính bền vững của máy khách, cookie và các đối tượng lưu trữ flash.


12

Hàm Javascript này trình bày một hộp thoại "Lưu dưới dạng" hoàn chỉnh cho người dùng chạy chương trình này thông qua trình duyệt. Người dùng nhấn OK và tập tin được lưu.

Chỉnh sửa: Đoạn mã sau chỉ hoạt động với IE Browser vì Firefox và Chrome đã coi mã này là một vấn đề bảo mật và đã chặn nó hoạt động.

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

Gọi hàm:

save_content_to_file("Hello", "C:\\test");

1
ir = createdEuity ('iframe'); - iframe là ID iFrame.
Nhiệt độ

Ngoài ra, nó có hoạt động trên tất cả các hệ điều hành không (miễn là chọn vị trí tệp hợp lệ?)
Anderson Green

4
Đây là một giải pháp tốt, nhưng nó chỉ hoạt động với IE? Tôi đã thử IE và FF và với FF nó không hoạt động.
u.gen

9

Nếu bạn đang sử dụng JScript (Javascript của Microsoft) để thực hiện kịch bản cục bộ bằng WSH (KHÔNG trong trình duyệt!), Bạn có thể sử dụng Scripting.FileSystemObjectđể truy cập hệ thống tệp.

Tôi nghĩ bạn có thể truy cập cùng một đối tượng trong IE nếu bạn tắt nhiều cài đặt bảo mật, nhưng đó sẽ là một ý tưởng rất, rất tệ.

MSDN tại đây


Tôi muốn làm điều này trong một htaứng dụng và nó đã giải quyết nó
chiliNUT

8

Hiện tại, các tệp có thể được ghi và đọc từ ngữ cảnh của tab / cửa sổ trình duyệt với API File , FileWriterFileSystem , mặc dù có những lưu ý khi sử dụng (xem phần đuôi của câu trả lời này).

Nhưng để trả lời câu hỏi của bạn:

Sử dụng Bakedoods *

Viết tập tin:

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

Đọc tài liệu:

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

Sử dụng API tệp, FileWriter và FileSystem thô

Viết tập tin:

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

Đọc tài liệu:

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

Chỉ cần những gì bạn yêu cầu phải không? Co le không. Hai API sau:

  • Hiện chỉ được triển khai trong các trình duyệt dựa trên Chromium (Chrome & Opera)
  • Đã được gỡ bỏ theo dõi tiêu chuẩn W3C và cho đến nay là các API độc quyền
  • Có thể bị xóa khỏi các trình duyệt triển khai trong tương lai
  • Hạn chế việc tạo tệp vào hộp cát (vị trí bên ngoài tệp có thể không tạo hiệu ứng) trên đĩa

Ngoài ra, đặc tả FileSystem xác định không có hướng dẫn về cách cấu trúc thư mục sẽ xuất hiện trên đĩa. Ví dụ, trong các trình duyệt dựa trên Chromium, hộp cát có một hệ thống tệp ảo (cấu trúc thư mục không nhất thiết tồn tại trên đĩa ở dạng giống như khi truy cập từ trong trình duyệt), trong đó các thư mục và tệp được tạo bằng API được đặt.

Vì vậy, mặc dù bạn có thể ghi tệp vào hệ thống bằng API, nhưng việc định vị tệp không có API (tốt, không có API tệp hệ thống) có thể là một việc không hề nhỏ.

Nếu bạn có thể giải quyết các vấn đề / giới hạn này, thì các API này là cách duy nhất để thực hiện những gì bạn đã yêu cầu.

Nếu bạn đang mở cho các giải pháp không phải là nguồn gốc, Silverlight cũng cho phép tệp i / o từ một cuộc thi tab / cửa sổ thông qua cách ly biệt lập . Tuy nhiên, mã được quản lý là cần thiết để sử dụng cơ sở này; một giải pháp yêu cầu viết mã như vậy nằm ngoài phạm vi của câu hỏi này.

Tất nhiên, một giải pháp sử dụng mã được quản lý bổ sung, để lại một mã chỉ có Javascript để viết, cũng nằm trong phạm vi của câu hỏi này;):

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

* Bakedoods là một thư viện Javascript thiết lập giao diện thống nhất có thể được sử dụng để tiến hành các hoạt động lưu trữ phổ biến trong tất cả các phương tiện lưu trữ gốc và một số phương tiện lưu trữ không phải là bản địa. Nó được duy trì bởi anh chàng này ngay tại đây :).



5

Trong ngữ cảnh của trình duyệt, Javascript có thể ĐỌC tệp do người dùng chỉ định. Xem blog của Eric Bidelman để biết chi tiết về cách đọc tệp bằng API tệp. Tuy nhiên, Javascript dựa trên trình duyệt không thể VIẾT hệ thống tệp của máy tính cục bộ mà không tắt một số cài đặt bảo mật vì nó được coi là mối đe dọa bảo mật cho bất kỳ trang web nào thay đổi tùy ý hệ thống tệp cục bộ của bạn.

Nói rằng, có một số cách để làm việc xung quanh nó tùy thuộc vào những gì bạn đang cố gắng làm:

  1. Nếu đó là trang web của riêng bạn, bạn có thể nhúng Applet Java vào trang web. Tuy nhiên, khách truy cập phải cài đặt Java trên máy cục bộ và sẽ được cảnh báo về rủi ro bảo mật. Người truy cập phải cho phép các applet được tải. Java Applet giống như một phần mềm thực thi có quyền truy cập hoàn toàn vào máy tính cục bộ.

  2. Chrome hỗ trợ một hệ thống tệp là một phần hộp cát của hệ thống tệp cục bộ. Xem trang này để biết chi tiết. Điều này có thể cung cấp cho bạn để tạm thời lưu những thứ cục bộ. Tuy nhiên, điều này không được hỗ trợ bởi các trình duyệt khác.

  3. Nếu bạn không giới hạn trình duyệt, Node.js có giao diện hệ thống tệp hoàn chỉnh. Xem ở đây để xem tài liệu hệ thống tập tin của nó . Lưu ý rằng Node.js có thể chạy không chỉ trên các máy chủ mà còn cho bất kỳ máy khách nào kể cả windows. Người chạy thử nghiệm javascript Karma dựa trên Node.js. Nếu bạn chỉ muốn lập trình bằng javascript trên máy tính cục bộ thì đây là một tùy chọn.


3

Để tạo tập tin hãy thử

function makefile(){
  var fso;
  var thefile;

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

    thefile.close()
    }

Tạo thư mục của bạn trong ổ C vì các cửa sổ có bảo mật chống ghi từ web, ví dụ: tạo thư mục có tên "tmp" trong ổ C.


2

Bạn sẽ phải chuyển sang Flash, Java hoặc Silverlight. Trong trường hợp của Silverlight, bạn sẽ xem Kho lưu trữ biệt lập . Điều đó sẽ giúp bạn ghi vào các tệp trong sân chơi của riêng bạn trên đĩa người dùng. Nó sẽ không cho phép bạn viết bên ngoài sân chơi của bạn mặc dù.


1

Bạn không thể làm điều này theo bất kỳ cách nào trên nhiều trình duyệt. IE có các phương thức để cho phép các ứng dụng "đáng tin cậy" sử dụng các đối tượng ActiveX để đọc / ghi tệp, nhưng thật không may.

Nếu bạn đang tìm cách lưu thông tin người dùng, rất có thể bạn sẽ cần sử dụng cookie.


4
Và rào cản để trở thành một ứng dụng "đáng tin cậy" là gì? Một cuộc đối thoại xác nhận?
Breton

@Philip, Không ai nói cần phải có trình duyệt chéo. Một giải pháp khác nhau cho mỗi trình duyệt là tốt.
Pacerier

1

Từ thử nghiệm ReactJS, đoạn mã sau ghi thành công một tệp:

import writeJsonFile from 'write-json-file';

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

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

Tệp được ghi vào thư mục chứa các bài kiểm tra, do đó việc ghi vào tệp JSON thực tế '* .json' tạo ra một vòng lặp!


0

Bạn không thể thực hiện tập tin i / o ở phía máy khách bằng cách sử dụng javascript vì đó sẽ là một rủi ro bảo mật. Bạn sẽ phải yêu cầu họ tải xuống và chạy exe hoặc nếu tệp nằm trên máy chủ của bạn, hãy sử dụng AJAX và ngôn ngữ phía máy chủ như PHP để thực hiện i / o trên máy chủ


1
Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ.
quấy rối

@harasta, Chính xác. Vui lòng xóa câu trả lời này và chuyển nó thành một bình luận.
Pacerier

0

Có hai cách để đọc và viết tệp bằng JavaScript

  1. Sử dụng tiện ích mở rộng JavaScript

  2. Sử dụng một trang web và các đối tượng Active X


-1

Đây là giải pháp ghi cho chrome v52 + (người dùng vẫn cần chọn đích doe ...)
nguồn: 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()

Thích hợp nhất để viết dữ liệu lớn được tạo ra ở phía khách hàng. Mặt
khác, tôi khuyên bạn nên sử dụng FileSaver.js để lưu Blob / Files

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.