æä»¶ç³»ç» API
å®å ¨ä¸ä¸æ: æ¤ç¹æ§ä» å¨ä¸äºæ¯æçæµè§å¨çå®å ¨ä¸ä¸æï¼HTTPSï¼ä¸å¯ç¨ã
夿³¨ï¼ æ¤ç¹æ§å¨ Web Worker ä¸å¯ç¨ã
æä»¶ç³»ç» APIï¼File System APIï¼ââ以åéè¿æä»¶ç³»ç»è®¿é® APIï¼File System Access APIï¼æä¾çæ©å±æ¥è®¿é®è®¾å¤æä»¶ç³»ç»ä¸çæä»¶ââå è®¸ä½¿ç¨æä»¶è¯»å以åæä»¶ç®¡çåè½ã
请åé ä¸å ¶ä»æä»¶ç¸å ³ API çå ³ç³»ï¼ä»¥äºè§£æ¤ APIãæä»¶åç®å½æ¡ç® API åæä»¶ API ä¹é´çåºå«ã
æ¦å¿µä¸ç¨æ³
æ¤ API å 许ç¨åºä¸ç¨æ·æ¬å°è®¾å¤ä¸çææ¯ç¨æ·è½å¤è®¿é®çç½ç»æä»¶ç³»ç»ä¸çæä»¶è¿è¡äº¤äºãæ¤ API çæ ¸å¿åè½å æ¬è¯»åæä»¶ãåå ¥æä¿åæä»¶ä»¥å访é®ç®å½ç»æã
大夿°ä¸æä»¶åç®å½ç交äºé½éè¿å¥ææ¥å®æãç¶ç±» FileSystemHandle æ´¾çåºä¸¤ä¸ªåç±»ï¼FileSystemFileHandle å FileSystemDirectoryHandleï¼åå«è¡¨ç¤ºæä»¶å¥æåç®å½å¥æã
ä¸ä¸ªå¥æä»£è¡¨äºç¨æ·æä½ç³»ç»ä¸çä¸ä¸ªæä»¶æç®å½ãä½ å¯ä»¥éè¿è°ç¨è¯¸å¦ window.showOpenFilePicker() å window.showDirectoryPicker() ä¸ç±»çæ¹æ³åç¨æ·æ¾ç¤ºä¸ä¸ªæä»¶éæ©å¨æç®å½éæ©å¨ï¼ä»¥æ¤æ¥è·å¾å¥æã䏿¦è°ç¨äºè¿äºå½æ°ï¼éæ©å¨å°±ä¼åºç°ï¼ç¨æ·å¯ä»¥ç¨å®éæ©ä¸ä¸ªæä»¶æç®å½ãåªè¦è¿ä¸ªæ¥éª¤æå宿ï¼å°±ä¼è¿å奿ã
ä½ è¿å¯ä»¥ä»ä»¥ä¸éå¾è·å¾å¥æï¼
- HTML ææ¾ API ç
DataTransferItem.getAsFileSystemHandle()æ¹æ³ã - æä»¶å¤ç APIã
æ¯ç§å¥æé½æä¾äºå ¶ç¬æçåè½ï¼åå³äºä½ 使ç¨çç§ç±»ï¼ä¼æäºè®¸å·®å¼ï¼è¯¦è§æ¥å£é¨åï¼ãå¨è·å¾å¥æåï¼ä½ 便å¯ä»¥è®¿é®æä»¶çæ°æ®ææ¯è¢«éä¸çç®å½çä¿¡æ¯ï¼å å«åç®å½ï¼ãæ¤ API å¼è¾äº web æ¤åä¸ç´ç¼ºä¹çæ½å¨åè½ãä½ä¸è®ºå¦ä½ï¼å®å ¨æ§æ¯è®¾è®¡ API æ¶çé¦è¦èéï¼é¤éç¨æ·æç¡®ææï¼å¦åå°±ä¸å è®¸è®¿é®æä»¶åç®å½çæ°æ®ï¼æ³¨æï¼æºç§ææä»¶ç³»ç»å¹¶é妿¤ï¼å ä¸ºå ¶å¯¹ç¨æ·ä¸å¯è§ï¼ã
夿³¨ï¼ä½¿ç¨æ¤ API çç¹æ§æ¶å¯è½ä¼æåºçåç§å¼å¸¸å·²å¨è§èå®ä¹çç¸å ³é¡µé¢ä¸ååºãç¶èï¼API ä¸åºå±æä½ç³»ç»ç交äºä½¿å¾å®é æ 嵿´å 夿ãè¿éæä¾ä¸ç¯å ³äºå¨è§èä¸ååºé误对åºè¡¨çæè®®ï¼å ¶ä¸å å«äºä¸äºæç¨çä¿¡æ¯ã
夿³¨ï¼åºäº FileSystemHandle ç对象è½å¤è¢«åºåååå¨è³ IndexedDB æ°æ®åºå®ä¾ä¸ï¼ä¹å¯ä»¥éè¿ postMessage() ä¼ éã
æºç§ææä»¶ç³»ç»
æºç§ææä»¶ç³»ç»ï¼origin private file systemï¼OPFSï¼å±äºæä»¶ç³»ç» APIï¼æä¾äºé¡µé¢æå±çæºä¸ç¨çåå¨ç«¯ç¹ï¼å¹¶ä¸ä¸åå¸¸è§æä»¶ç³»ç»é£æ ·å¯¹ç¨æ·å¯è§ã宿ä¾å¯¹ä¸ç§ç»è¿é«åº¦æ§è½ä¼åçç¹æ®æä»¶ç访é®è½åçéæ©ï¼ä¾å¦ï¼å¯¹æä»¶å 容çåå°åå ¥è®¿é®ã
以䏿¯ä¸äºå¯è½çç¨ä¾ï¼
-
å ·ææä¹ ä¸ä¼ ç»ä»¶çåºç¨
-
å½éæ©è¦ä¸ä¼ çæä»¶æç®å½æ¶ï¼ä½ å¯ä»¥å°æä»¶å¤å¶å°æ¬å°æ²çä¸å¹¶ä¸æ¬¡ä¸ä¼ ä¸ä¸ªåã
-
åºç¨å¯ä»¥å¨ä¸æåéæ°å¯å¨ä¸ä¼ ï¼ä¾å¦æµè§å¨å ³éæå´©æºãè¿æ¥ä¸ææè®¡ç®æºå ³æºã
-
-
å ·æå¤§éåªä½éæèµæºçè§é¢æ¸¸ææå ¶ä»åºç¨
-
åºç¨ä¸è½½ä¸ä¸ªæå¤ä¸ªå¤§å tar å å¹¶å°å ¶æ¬å°å±å¼ä¸ºç®å½ç»æã
-
åºç¨å¨åå°é¢å è·åéæèµæºï¼å æ¤ç¨æ·æ éçå¾ ä¸è½½å³å¯è¿å ¥ä¸ä¸ä¸ªä»»å¡ææ¸¸æçº§å«ã
-
-
æ¯æç¦»çº¿è®¿é®ææ¬å°ç¼åçé³é¢æç §çç¼è¾å¨ï¼æ§è½åé度æä½³ï¼
- åºç¨å¯ä»¥å°±å°åå ¥æä»¶ï¼ä¾å¦ï¼ä» è¦ç ID3/EXIF æ ç¾è䏿¯æ´ä¸ªæä»¶ï¼ã
-
离线è§é¢æ¥çå¨
- åºç¨å¯ä»¥ä¸è½½å¤§æä»¶ï¼>1GBï¼ä»¥ä¾ä»¥åæ¥çã
- 该åºç¨å¯ä»¥è®¿é®é¨åä¸è½½çæä»¶ï¼è¿æ ·ä½ å°±å¯ä»¥è§ç DVD ç第ä¸ç« ï¼å³ä½¿è¯¥åºç¨ä»å¨ä¸è½½å ¶ä½å å®¹ï¼æè ç±äºä½ å¿ é¡»è·å»èµ¶ç«è½¦è导è´åºç¨æªå®æä¸è½½ï¼ã
-
离线 Web é®ä»¶å®¢æ·ç«¯
- 客æ·ç«¯ä¸è½½éä»¶å¹¶å°å ¶åå¨å¨æ¬å°ã
- 客æ·ç«¯ç¼åé件以ä¾ç¨åä¸ä¼ ã
请é 读æä»¬çæºç§ææä»¶ç³»ç»ï¼ä»¥äºè§£å¦ä½ä½¿ç¨å®ã
ä¿åæä»¶
- 对äºå¼æ¥å¥æï¼ä½¿ç¨
FileSystemWritableFileStreamæ¥å£ãå½ä½ æ³è¦ä¿åçæ°æ®æ¯BlobãString对象ãå符串åé¢éæbufferå½¢å¼çæ¶åï¼ä½ å¯ä»¥æå¼ä¸ä¸ªåå ¥æµææ°æ®ä¿åå°æä»¶ãå¯ä»¥æ¯å·²ç»åå¨çæä»¶ï¼ä¹å¯ä»¥æ¯æ°æä»¶ã - 对äºåæ¥ç
FileSystemSyncAccessHandleï¼ä½¿ç¨write()æ¹æ³åå ¥æ´æ¹ãä½ è¿å¯ä»¥éæ©è°ç¨flush()ä»¥ä½¿æ´æ¹å¨æå®çæ¶é´ç¹åå ¥ç£çï¼æè ä½ ä¹å¯ä»¥è®©åºå±æä½ç³»ç»å¨å ¶è®¤ä¸ºåéçæ¶é´ç¹æ§è¡åå ¥ï¼è¿ä¹å大夿°æ åµä¸åºè¯¥é½ä¸ä¼æé®é¢ï¼ã
æ¥å£
FileSystemChangeRecord-
å å«
FileSystemObserverè§å¯å°çåä¸ªæ´æ¹ç详ç»ä¿¡æ¯ã FileSystemHandle-
代表æä»¶æç®å½æ¡ç®ç对象ãå¤ä¸ªå¥æå¯ä»¥æä»£åä¸ä¸ªæ¡ç®ã大夿°æ åµä½ é½ä¸ä¼ç´æ¥ç¨å°
FileSystemHandleï¼èæ¯ä¼ç¨å°å®ç忥å£FileSystemFileHandleåFileSystemDirectoryHandleã FileSystemFileHandle-
æä¾ä¸ä¸ªæä»¶ç³»ç»æ¡ç®ç奿ã
FileSystemDirectoryHandle-
æä¾ä¸ä¸ªæä»¶ç³»ç»ç®å½ç奿ã
FileSystemObserver-
æä¾ä¸ç§è§å¯æéæä»¶æç®å½çååçæºå¶ã
FileSystemSyncAccessHandle-
æä¾ä¸ä¸ªæä»¶ç³»ç»æ¡ç®ç忥奿ï¼ç¨äºå¨ç£çä¸åå°æä½å个æä»¶ãå ¶å¨æä»¶è¯»åä¸çåæ¥ç¹æ§å¯å¨å¼æ¥æä½å¼éè¾å¤§çæ æ¯ä¸ä½¿å ³é®æ¹æ³æ¥ææ´ä¼ç§çæ§è½ï¼ä¾å¦ WebAssemblyãæ¤ç±»åªè½å¨ä¸ç¨äºæä½æºç§ææä»¶ç³»ç»ä¸çæä»¶çä¸ç¨ Web Worker ä¸è®¿é®ã
FileSystemWritableFileStream-
ä¸ä¸ªéå äºä¾¿äºæä½ç£çä¸å个æä»¶çæ¹æ³ç
WritableStream对象ã
å ¶ä»æ¥å£çæ©å±
Window.showDirectoryPicker()-
æ¾ç¤ºå è®¸ç¨æ·éæ©ç®å½çç®å½éæ©å¨ã
Window.showOpenFilePicker()-
æ¾ç¤ºå è®¸ç¨æ·éæ©ä¸ä¸ªæå¤ä¸ªæä»¶çæä»¶éæ©å¨ã
Window.showSaveFilePicker()-
æ¾ç¤ºå è®¸ç¨æ·ä¿åæä»¶çæä»¶éæ©å¨ã
DataTransferItem.getAsFileSystemHandle()-
è¿å
Promiseï¼å¦ææå¨çé¡¹ç®æ¯æä»¶ï¼åå ç°FileSystemFileHandleï¼å¦ææå¨çé¡¹ç®æ¯ç®å½ï¼åå ç°FileSystemDirectoryHandleã StorageManager.getDirectory()-
ç¨äºè·å对
FileSystemDirectoryHandle对象çå¼ç¨ï¼è¯¥å¯¹è±¡å 许访é®åå¨å¨æºç§ææä»¶ç³»ç»ä¸çç®å½åå ¶å 容ãè¿åä¸ä¸ªå ç°FileSystemDirectoryHandle对象çPromiseã
示ä¾
>è®¿é®æä»¶
以ä¸ä»£ç å è®¸ç¨æ·å¨æä»¶éæ©å¨ä¸éæ©ä¸ä¸ªæä»¶ã
async function getFile() {
// æå¼æä»¶éæ©å¨å¹¶ä»ç»æä¸è§£æåºç¬¬ä¸ä¸ªå¥æ
const [fileHandle] = await window.showOpenFilePicker();
const file = await fileHandle.getFile();
return file;
}
ä¸é¢ç弿¥å½æ°å¯ä»¥æ¾ç¤ºä¸ä¸ªæä»¶éæ©å¨ï¼å¹¶å¨éæ©äºæä»¶æ¶ä½¿ç¨ getFile() æ¹æ³åå¾å
容ã
const pickerOpts = {
types: [
{
description: "Images",
accept: {
"image/*": [".png", ".gif", ".jpeg", ".jpg"],
},
},
],
excludeAcceptAllOption: true,
multiple: false,
};
async function getTheFile() {
// æå¼æä»¶éæ©å¨å¹¶ä»ç»æä¸è§£æåºç¬¬ä¸ä¸ªå¥æ
const [fileHandle] = await window.showOpenFilePicker(pickerOpts);
// è·åæä»¶å
容
const fileData = await fileHandle.getFile();
}
访é®ç®å½
ä¸é¢ç示ä¾è½å¤å徿å®åç§°çç®å½ç奿ï¼å¦æç®å½ä¸åå¨ï¼åå建ã
const dirName = "directoryToGetName";
// å设æä»¬å·²ç»æä¸ä¸ªç®å½å¥æï¼âcurrentDirHandleâ
const subDir = currentDirHandle.getDirectoryHandle(dirName, { create: true });
ä¸é¢ç弿¥å½æ°ä½¿ç¨ resolve() æ¥æ¥æ¾è¢«éæ©æä»¶ç¸å¯¹äºæå®ç®å½å¥æçè·¯å¾ã
async function returnPathDirectories(directoryHandle) {
// éè¿æ¾ç¤ºæä»¶éæ©å¨æ¥è·å¾ä¸ä¸ªæä»¶å¥æ
const [handle] = await self.showOpenFilePicker();
if (!handle) {
// å¦æç¨æ·åæ¶äºéæ©æè
æå¼æä»¶å¤±è´¥
return;
}
// æ£æ¥æä»¶å¥ææ¯å¦åå¨äºç®å½å¥æçç®å½ä¸
const relativePaths = await directoryHandle.resolve(handle);
if (relativePaths === null) {
// ä¸å¨ç®å½å¥æä¸
} else {
// relativePaths æ¯ä¸ä¸ªå
å«åç§°çæ°ç»ï¼æç¤ºç¸å¯¹è·¯å¾
for (const name of relativePaths) {
// æå°æ°ç»çæ¯ä¸ªå
ç´
console.log(name);
}
}
}
åå ¥æä»¶
以ä¸å¼æ¥å½æ°è½å¤æå¼ä¸ä¸ªæä»¶éæ©å¨ï¼å¹¶å¨éæ©äºæä»¶æ¶è¿åä¸ä¸ª FileSystemFileHandleãç¶åä½¿ç¨ FileSystemFileHandle.createWritable() æ¹æ³å建ä¸ä¸ªåå
¥æµã
ç¶åå°ç¨æ·å®ä¹çä¸ä¸ª Blob åå
¥æµä¸ï¼éåå
³é该æµã
async function saveFile() {
// å建ä¸ä¸ªæ°å¥æ
const newHandle = await window.showSaveFilePicker();
// å建ä¸ä¸ª FileSystemWritableFileStream ç¨äºåå
¥
const writableStream = await newHandle.createWritable();
// åå
¥æä»¬çæä»¶
await writableStream.write(imgBlob);
// å
³éæä»¶å¹¶å°å
容åå
¥å°ç£ç
await writableStream.close();
}
ä¸é¢ç示ä¾å±ç¤ºè½å¤å write() æ¹æ³ä¼ éçä¸åé项ã
// åªä¼ éæ°æ®ï¼æ²¡æé项ï¼
writableStream.write(data);
// 念䏿å®ä½ç½®åå
¥æ°æ®
writableStream.write({ type: "write", position, data });
// å°æä»¶å½åçæéæ´æ°å°æå®çåç§»ä½ç½®
writableStream.write({ type: "seek", position });
// è£åæä»¶çåèé¿åº¦ä¸º size åéç大å°
writableStream.write({ type: "truncate", size });
å¨ OPFS ä¸åæ¥è¯»åæä»¶
è¿ä¸ªç¤ºä¾å±ç¤ºå¦ä½å¨æºç§ææä»¶ç³»ç»ä¸åæ¥è¯»åæä»¶ã
以ä¸å¼æ¥äºä»¶å¤ç彿°å¤äº Web Worker ä¸ä¸æï¼ä»ä¸»çº¿ç¨æ¥æ¶æ¶æ¯ã
- å建ä¸ä¸ªå¼æ¥æä»¶è®¿é®å¥æã
- è·åæä»¶å¤§å°å¹¶å建ä¸ä¸ª
ArrayBufferæ¥å®¹çº³å®ã - å°æä»¶å 容读åå°ç¼å²åºä¸ã
- å°æ¶æ¯ç¼ç ï¼å¹¶å°å ¶åå ¥å°æä»¶æ«å°¾ã
- å°æ´æ¹æä¹ åè³ç£çå¹¶å ³é访é®å¥æã
onmessage = async (e) => {
// è·åä»ä¸»çº¿ç¨åå¾ worker çæ¶æ¯
const message = e.data;
// è·å OPFS ä¸è稿æä»¶ç奿
const root = await navigator.storage.getDirectory();
const draftHandle = await root.getFileHandle("draft.txt", { create: true });
// è·ååæ¥è®¿é®å¥æ
const accessHandle = await draftHandle.createSyncAccessHandle();
// è·åæä»¶å¤§å°
const fileSize = accessHandle.getSize();
// å°æä»¶å
容读åå°ç¼å²åº
const buffer = new DataView(new ArrayBuffer(fileSize));
const readBuffer = accessHandle.read(buffer, { at: 0 });
// å°æ¶æ¯åå
¥å°æä»¶æ«å°¾
const encoder = new TextEncoder();
const encodedMessage = encoder.encode(message);
const writeBuffer = accessHandle.write(encodedMessage, { at: readBuffer });
// å°æ´æ¹æä¹
åè³ç£ç
accessHandle.flush();
// ç¨å® FileSystemSyncAccessHandle è®°å¾æå®å
³é
accessHandle.close();
};
夿³¨ï¼å¨è§èæ©æçæ¬ä¸ï¼FileSystemSyncAccessHandle ç close()ãflush()ãgetSize() å truncate() 被ä¸åé»è¾å°æå®ä¸ºå¼æ¥æ¹æ³ãæ¤é®é¢ç°å·²è¢«ä¿®æ£ï¼ä½æäºæµè§å¨ä¾ç¶æ¯æå¼æ¥çæ¬ã
è§è
| è§è |
|---|
| File System> |
| File System Access> |