1
+ import { openDB } from 'idb' ;
1
2
import { v4 as uuidv4 } from 'uuid' ;
2
3
3
- class LocalStorageManager {
4
+ class IndexedDBManager {
4
5
constructor ( defaultExpiryTime = 60 * 60 * 1000 ) {
5
6
this . defaultExpiryTime = defaultExpiryTime ; // 默认过期时间为 1 小时
7
+ this . dbPromise = openDB ( 'file-store' , 1 , {
8
+ upgrade ( db ) {
9
+ db . createObjectStore ( 'files' , { keyPath : 'uid' } ) ;
10
+ } ,
11
+ } ) ;
6
12
}
7
13
8
14
// 存储数据方法,返回生成的唯一 key
9
- storeFile ( file ) {
15
+ async storeFile ( file ) {
10
16
const key = uuidv4 ( ) ;
11
17
const expiry = new Date ( new Date ( ) . getTime ( ) + this . defaultExpiryTime ) ;
12
18
const reader = new FileReader ( ) ;
13
19
14
20
return new Promise ( ( resolve , reject ) => {
15
21
reader . readAsDataURL ( file ) ;
16
- reader . onload = ( ) => {
22
+ reader . onload = async ( ) => {
17
23
const base64 = reader . result ;
18
24
const fileInfo = {
25
+ uid : key ,
19
26
name : file . name ,
20
27
type : file . type ,
21
28
size : file . size ,
22
29
base64,
23
30
expiry,
24
31
} ;
25
- localStorage . setItem ( key , JSON . stringify ( fileInfo ) ) ;
26
- resolve ( key ) ;
32
+ try {
33
+ const db = await this . dbPromise ;
34
+ await db . put ( 'files' , fileInfo ) ;
35
+ resolve ( key ) ;
36
+ } catch ( e ) {
37
+ reject ( 'IndexedDB 存储失败' ) ;
38
+ }
27
39
} ;
28
40
reader . onerror = ( error ) => {
29
41
reject ( '文件读取失败' ) ;
@@ -32,22 +44,21 @@ class LocalStorageManager {
32
44
}
33
45
34
46
// 按照 keys 数组,返回批量取出存储的 files
35
- getFiles ( keys ) {
36
- return keys
37
- . map ( ( key ) => {
38
- const item = localStorage . getItem ( key ) ;
39
- if ( item ) {
40
- const fileInfo = JSON . parse ( item ) ;
41
- if ( new Date ( fileInfo . expiry ) > new Date ( ) ) {
42
- return { ...fileInfo , uid : key } ;
43
- } else {
44
- localStorage . removeItem ( key ) ;
45
- return null ;
46
- }
47
+ async getFiles ( keys ) {
48
+ const db = await this . dbPromise ;
49
+ const files = await Promise . all (
50
+ keys . map ( async ( key ) => {
51
+ const file = await db . get ( 'files' , key ) ;
52
+ if ( file && new Date ( file . expiry ) > new Date ( ) ) {
53
+ return file ;
54
+ } else if ( file ) {
55
+ await db . delete ( 'files' , key ) ;
56
+ return null ;
47
57
}
48
58
return null ;
49
- } )
50
- . filter ( ( file ) => file !== null ) ;
59
+ } ) ,
60
+ ) ;
61
+ return files . filter ( ( file ) => file !== null ) ;
51
62
}
52
63
53
64
// 设置过期时间
@@ -56,17 +67,21 @@ class LocalStorageManager {
56
67
}
57
68
58
69
// 按照指定的 keys 从存储里面删除数据
59
- removeFiles ( keys ) {
60
- return keys . map ( ( key ) => {
61
- const item = localStorage . getItem ( key ) ;
62
- if ( item ) {
63
- localStorage . removeItem ( key ) ;
64
- return { key, success : true } ;
65
- } else {
66
- return { key, success : false , error : '文件不存在' } ;
67
- }
68
- } ) ;
70
+ async removeFiles ( keys ) {
71
+ const db = await this . dbPromise ;
72
+ const results = await Promise . all (
73
+ keys . map ( async ( key ) => {
74
+ const file = await db . get ( 'files' , key ) ;
75
+ if ( file ) {
76
+ await db . delete ( 'files' , key ) ;
77
+ return { key, success : true } ;
78
+ } else {
79
+ return { key, success : false , error : '文件不存在' } ;
80
+ }
81
+ } ) ,
82
+ ) ;
83
+ return results ;
69
84
}
70
85
}
71
86
72
- export default LocalStorageManager ;
87
+ export default IndexedDBManager ;
0 commit comments