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?
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?
Câu trả lời:
Để đầ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/
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
This answer is not useful
.
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/
đâ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.
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");
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ệ.
hta
ứng dụng và nó đã giải quyết nó
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 , FileWriter và FileSystem , 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:
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 :).
Đối với Firefox:
var file = Components.classes["@mozilla.org/file/local;1"].
createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("/home");
Xem https://developer.mozilla.org/en-US/docs/Code_snippets/File_I_O
Đối với những người khác, hãy kiểm tra ứng dụng TiddlyWiki để xem nó hoạt động như thế nào.
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:
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ộ.
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.
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.
Để 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.
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ù.
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.
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!
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ủ
Có hai cách để đọc và viết tệp bằng JavaScript
Sử dụng tiện ích mở rộng JavaScript
Sử dụng một trang web và các đối tượng Active X
Đâ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