
如何使用浏览器来操作本地文件系统中的文件呢,相比大家第一时间想到是的input type=“file”来读取文件,然后通过下载来写入文件,对,这是最古老的方式了,他只能上传和下载文件,不能修改和删除本地文件或文件夹呢,随着File system access api的推出,让现代浏览器拥有了像app一样读写本地系统文件的能力。
今天我就来跟大家说说这个新的api怎么用js来编写,主要有三个方法:Window.showOpenFilePicker()、 Window.showSaveFilePicker()和Window.showDirectoryPicker()。
一、js读写浏览器端本地文件和文件夹
1、读取并修改本地文件,通过showOpenFilePicker来弹出一个选择文件的窗口,通过 await fileHandle.getFile()获取文件对象,修改是通过fileHandle.createWritable()来修改保存到本地系统,完整代码如下<html>
<head>
<meta charset="UTF-8">
<link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/bootstrap.4.3.1.min.css">
<style>
body{
padding: 10px;
}
</style>
</head>
<body>
<p><button id="openlocalfile">打开本地文件</button>
<button id="savetolocalfile">保存到本地</button>不要在iframe中打开</p>
<textarea id="editor" style="width:100%;height:400px;"></textarea>
<script>
const openbtn = document.getElementById('openlocalfile');
const editor = document.getElementById('editor');
const savebtn = document.getElementById('savetolocalfile');
let fileHandle;
openbtn.addEventListener('click', async () => {
[fileHandle] = await window.showOpenFilePicker();
const file = await fileHandle.getFile();
const contents = await file.text();
editor.value = contents;
});
savebtn.addEventListener('click', async () => {
if(fileHandle==null){
alert("请先打开一个本地文件后进行修改");
return;
}
const writable = await fileHandle.createWritable();
// 写入文件
await writable.write(editor.value);
// 关闭
await writable.close();
alert("修改本地文件成功");
});
</script>
</body>
</html>
那么如果要另存为呢?这里就要用到window.showSaveFilePicker了,他可以弹出另外为窗口,可以定义默认名称及文档类型描述等,配置如下:
const fileHandle2 = await window.showSaveFilePicker({
suggestedName: 'Uint8ClampedArray.txt',
types: [{
description: '文本文件',
accept: {
'text/plain': ['.txt'],
},
}],
});
完整的打开和另外为文件代码如下:
<html>
<head>
<meta charset="UTF-8">
<link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/bootstrap.4.3.1.min.css">
<style>
body{
padding: 10px;
}
</style>
</head>
<body>
<p><button id="openlocalfile">打开本地文件</button>
<button id="savetolocalfile">保存到本地</button>不要在iframe中打开</p>
<textarea id="editor" style="width:100%;height:400px;"></textarea>
<script>
const openbtn = document.getElementById('openlocalfile');
const editor = document.getElementById('editor');
const savebtn = document.getElementById('savetolocalfile');
let fileHandle;
openbtn.addEventListener('click', async () => {
[fileHandle] = await window.showOpenFilePicker();
const file = await fileHandle.getFile();
const contents = await file.text();
editor.value = contents;
});
savebtn.addEventListener('click', async () => {
if(fileHandle==null){
alert("请先打开一个本地文件后进行修改");
return;
}
//创建一个另外为
const fileHandle2 = await window.showSaveFilePicker({
suggestedName: 'Uint8ClampedArray.txt',
types: [{
description: '文本文件',
accept: {
'text/plain': ['.txt'],
},
}],
});
const writable = await fileHandle2.createWritable();
// 写入文件
await writable.write(editor.value);
// 关闭
await writable.close();
alert("另存为本地文件成功");
});
</script>
</body>
</html>
那么删除文件呢?删除文件我们在打开目录中讲解。二、js用浏览器打开本地目录
打开一个目录,并获取子目录,这里要用到window.showDirectoryPicker(),他可以返回一个文件夹的句柄。完整代码如下:
<html>
<head>
<meta charset="UTF-8">
<link type="text/css" rel="stylesheet" href="//repo.bfw.wiki/bfwrepo/css/bootstrap.4.3.1.min.css">
<style>
body{
padding: 10px;
}
</style>
</head>
<body>
<p><button id="openlocalfile">打开本地文件夹</button> 不要在iframe中打开,结果在console中查看
<script>
const openbtn = document.getElementById('openlocalfile');
let dirHandle;
op...点击查看剩余70%
网友评论0