文件句柄是可序列化的,这意味着您可以将文件句柄保存到IndexedDB,或调用postMessage()在同一顶级源之间发送它们。
4个答案
从'导入{get,set} https://unpkg.com/ [电子邮件保护] /dist/esm/index.js'; const-pre=document.querySelector('pre'); const按钮=document.querySelector('按钮'); button.addEventListener('click',async()=>{ 尝试{ const fileHandleOrUndefined=等待获取('file'); if(fileHandleOrUndefined){ 前.text内容= `已从IndexedDB.`;检索到文件句柄“${fileHandleOrUndefined.name}”; 回报; } //这总是返回一个数组,但我们只需要第一个条目。 const[fileHandle]=等待窗口.showOpenFilePicker(); 等待集('file',fileHandle); 前.text内容= `IndexedDB.`;中“${fileHandle.name}”的存储文件句柄; }捕获(错误){ 警报(error.name,error.message); } });
-
谢谢,这很有帮助。 还有一个问题:您知道是否可以将句柄存储在chrome.storage.local数据库中吗? 还是IndexedDB是保留完整对象的唯一方法? – 查尔斯·约翰逊 评论 2021年1月28日18:12 -
三 -
-
1 -
1
数据库.version(1).stores({ 测试:“++id” }); const[fileHandle]=等待窗口.showOpenFilePicker(); db.test.add({fileHandle})
数据库.version(1).stores({ 测试:“++” }); const[fileHandle]=等待窗口.showOpenFilePicker(); db.test.add({fileHandle})
/**@type{Promise<IDBDatabase>}*/ const dbPromise=新承诺((resolve,reject)=>{ const请求=indexedDB.open('handle',1); request.oupgradeneeded=(事件)=>{ const数据库=事件目标结果; db.createObjectStore(“句柄”,{keyPath:“id”}); }; request.onsuccess=(事件)=>{ 解决(event.target.result); }; request.onerror=(事件)=>{ console.error(事件); 拒绝(event.target.error); }; }); /** *将目录句柄保存到数据库。 *@param{FileSystemDirectoryHandle}dirHandle-要保存的目录句柄。 *@returns{Promise<void>}保存句柄时解析的承诺。 */ export const saveDirHandle=(dirHandle)=>{ return new Promise((resolve,reject)=>{ dbPromise.then((db)=>{ const事务=db.transaction(['handles'],'readwrite'); const store=transaction.objectStore('handles'); const请求=store.put({id:'lastFolder',handle:dirHandle}); request.onsuccess=()=>resolve(); request.onerror=()=>拒绝(request.error); }); }); }; /** *从数据库检索上次保存的文件夹句柄。 *@return{Promise<FileSystemDirectoryHandle | undefined>}一个用文件夹句柄解析的Promise,如果找不到,则解析为undefined。 */ export const getLastFolderHandle=()=>{ return new Promise((resolve,reject)=>{ dbPromise.then((db)=>{ const事务=db.transaction(['handles'],'readonly'); const store=transaction.objectStore('handles'); const请求=store.get('lastFolder'); request.onsuccess=(event)=>解析(event.target.result?.handle); request.onerror=()=>拒绝(request.error); }); }); };