1. 读取本地文件
方法1:
1. 使用input标签获取本地文件对象file(vue格式)
| <input type="file" @change="selectFail" /> |
复制
2. 接收回调处理获取到的文件数据
| |
| selectFail(event) { |
| |
| const file = event.target.files[0]; |
| if (file) { |
| const reader = new FileReader(); |
| reader.onload = (e) => { |
| |
| try { |
| this.msg = e.target.result |
| } catch (err) { |
| console.log('无法解析文件', err) |
| } |
| |
| }; |
| } |
| } |
复制
方法2
1. 使用浏览器API:window.showOpenFilePicker,注意文件选择 必须由用户的 交互动作 触发,不能直接调用
| <button @click="selectFail2">读取本地文件</button> |
复制
2. 获取文件对象并处理数据
| |
| async selectFail2() { |
| try { |
| |
| const [fileHandle] = await window.showOpenFilePicker(); |
| |
| this.fileHandle = fileHandle |
| |
| const file = await this.fileHandle.getFile(); |
| const contents = await file.text(); |
| this.msg = contents; |
| } catch (error) { |
| console.error('无法选择文件', error); |
| } |
| } |
复制
2. 保存(修改原文件内容)
| <button @click="saveFail">保存</button> |
复制
| |
| async saveFail() { |
| |
| const writable = await this.fileHandle.createWritable(); |
| |
| await writable.write(this.msg); |
| |
| await writable.close(); |
| } |
复制
3. 另存为
| <button @click="saveAsFail">另存为</button> |
复制
| |
| async saveAsFail() { |
| |
| const opts = { |
| type: 'save-file', |
| accepts: [{ |
| description: 'Text file', |
| extensions: ['txt'], |
| mimeTypes: ['text/plain'], |
| }] |
| }; |
| |
| const fileHandle = await window.showSaveFilePicker(opts); |
| |
| const writable = await fileHandle.createWritable(); |
| |
| await writable.write(this.msg); |
| |
| await writable.close(); |
| } |
复制
4. 完整代码及演示
| <template> |
| <div> |
| <input type="file" @change="selectFail" /> |
| <button @click="selectFail2">读取本地文件</button> |
| |
| <button @click="saveFail">保存</button> |
| <button @click="saveAsFail">另存为</button> |
| <div> |
| <input type="text" v-model="msg"> |
| </div> |
| </div> |
| </template> |
| |
| <script> |
| |
| export default { |
| data() { |
| return { |
| msg: '', |
| fileHandle: null, |
| } |
| }, |
| methods: { |
| |
| selectFail(event) { |
| const file = event.target.files[0]; |
| if (file) { |
| const reader = new FileReader(); |
| reader.onload = (e) => { |
| try { |
| this.msg = e.target.result; |
| } catch (err) { |
| console.log('无法解析JSON文件', err) |
| } |
| |
| }; |
| reader.readAsText(file); |
| } |
| }, |
| |
| async selectFail2() { |
| try { |
| const [fileHandle] = await window.showOpenFilePicker(); |
| this.fileHandle = fileHandle |
| const file = await this.fileHandle.getFile(); |
| const contents = await file.text(); |
| this.msg = contents; |
| } catch (error) { |
| console.error('无法选择文件', error); |
| } |
| }, |
| |
| async saveFail() { |
| const writable = await this.fileHandle.createWritable(); |
| await writable.write(this.msg); |
| await writable.close(); |
| }, |
| |
| async saveAsFail() { |
| const opts = { |
| type: 'save-file', |
| accepts: [{ |
| description: 'Text file', |
| extensions: ['txt'], |
| mimeTypes: ['text/plain'], |
| }] |
| }; |
| |
| const fileHandle = await window.showSaveFilePicker(opts); |
| const writable = await fileHandle.createWritable(); |
| await writable.write(this.msg); |
| await writable.close(); |
| } |
| } |
| } |
| </script> |
复制
