#javascript #file-system-access-api
#javascript #file-system-access-api
Вопрос:
В настоящее время я знакомлюсь с API доступа к файловой системе для будущего проекта, и у меня возникают трудности с использованием метода createWritable() в строке:
const writable = await fileHandle.createWritable();
Когда я запускаю его, он выдает ошибку:
TypeError: fileHandle.createWritable is not a function
Однако, когда я запускаю эту точную команду в консоли, она работает отлично.
Я использую Windows 10, если это вообще имеет значение. Спасибо за помощь.
Я включу свой соответствующий HTML и JS ниже:
HTML:
<body>
<h1>Hello There</h1>
<button class="read-btn">Read</button>
<textarea id="txt"></textarea>
<button class="create-btn">Create</button>
<button class="write-btn">Write</button>
</body>
<script src="./index.js"></script>
JS:
const readBtn = document.querySelector(".read-btn");
const createBtn = document.querySelector(".create-btn")
const writeBtn = document.querySelector(".write-btn");
const txt = document.querySelector("#txt");
// Store a ref to file handle
let fileHandle;
let contents;
// === READ FROM A FILE SYSTEM ===
readBtn.addEventListener("click", async () => {
// open filepicker
[fileHandle] = await window.showOpenFilePicker();
// Returns a file object
const file = await fileHandle.getFile();
// Runs text method on returned file object to access text
contents = await file.text();
// Inputs contents into txt
txt.value = contents;
});
// === WRITE TO FILESYSTEM ===
// Create a new file
async function getNewFileHandle() {
const options = {
types: [
{
description: 'Text Files',
accept: {
'text/plain': ['.txt'],
},
},
],
};
const handle = await window.showSaveFilePicker(options);
return handle;
}
// Save changes to disk
async function writeFile(fileHandle) {
contents = txt.value;
// Create a FileSystemWritableFileStream to write to.
const writable = await fileHandle.createWritable();
// Write the contents of the file to the stream.
await writable.write(contents);
// Close the file and write the contents to disk.
await writable.close();
}
createBtn.addEventListener("click", getNewFileHandle)
writeBtn.addEventListener("click", writeFile)
Комментарии:
1. Обслуживается ли этот скрипт через HTTPS?
2. @esqew нет, это не так, я использую расширение сервера liver для VS code. Это не приходило мне в голову. Спасибо, чувак, ты спасаешь жизнь! Вы хотите отправить его в качестве ответа, чтобы я мог пометить его как правильный?
Ответ №1:
Согласно документации MDN, window.showOpenFilePicker
, FileSystemFileHandle
, и FileSystemWritableFileStream
поддерживаются только в безопасных контекстах:
Безопасный контекст
Эта функция доступна только в защищенных контекстах (HTTPS), в некоторых или во всех поддерживающих браузерах.
Насколько я понимаю, расширение «Live Server» для VS Code не будет соответствовать этому требованию, но консоль разработчика будет.