不多说,在弄一个基于FileSytem/IndexedDB的小应用,目前处于基础开发阶段,

我们在使用FileSystem的时候无疑是需要知道浏览器的定额(配额的),怎么去查询,当然可以查询 Quota Management API

个人觉得还是略有复杂,为了避免不停的then,同时更少的关注内部的区别,再简单包装了一下。

不多说,代码:

/**
* 参考的API:
* http://w3c.github.io/quota-api/
*
*/ //文件系统请求标识
window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem
//根据URL取得文件的读取权限
window.resolveLocalFileSystemURL = window.resolveLocalFileSystemURL || window.webkitResolveLocalFileSystemURL //临时储存和永久存储
navigator.temporaryStorage = navigator.temporaryStorage || navigator.webkitTemporaryStorage;
navigator.persistentStorage = navigator.persistentStorage || navigator.webkitPersistentStorage; //常量
const _TEMPORARY = 'temporary', _PERSISTENT = 'persistent' /**
* 转为promise,主要是把 a.b(param1,param2,successCallback,errorCall) 转为promise
* @param {*期待的是函数} obj
* @param {*上下文} ctx
* @param {*参数} args
*/
function toPromise(obj, ctx, ...args) {
if (!obj) return obj //如果已经是Promise对象
if ('function' == typeof obj.then) return obj //若obj是函数直接转换
if ('function' == typeof obj) return _toPromise(obj) return obj; //函数转成 promise
function _toPromise(fn) {
return new Promise(function (resolve, reject) { fn.call(ctx, ...args, (...ags) => {
//多个参数返回数组,单个直接返回对象
resolve(ags && ags.length > 1 ? ags : ags[0])
}, (err) => {
reject(err)
}) })
}
} /**
* 查询和申请定额
* 测试脚本:
* 使用情况: FileStorageQuota.instance.queryInfo().then(data=>console.log(data))
* 申请空间: FileStorageQuota.instance.requestPersistentQuota().then(data=>console.log(data))
*/
class FileStorageQuota { constructor() { let supportedTypes = [_TEMPORARY, _PERSISTENT]; this.storageQuota = navigator.storageQuota || {
storages: { [_TEMPORARY]: navigator.webkitTemporaryStorage, [_PERSISTENT]: navigator.webkitPersistentStorage },
queryInfo: function (type) {
return toPromise(this.storages[type].queryUsageAndQuota, this.storages[type]).then(arr => {
return { usage: arr[0], quota: arr[1] }
})
},
requestPersistentQuota: function (requestQuota) {
return toPromise(this.storages[_PERSISTENT].requestQuota, this.storages[_PERSISTENT], requestQuota * 1024 * 1024).then(quota => {
return { quota }
})
},
supportedTypes
}
this.supportedTypes = supportedTypes
this._instance = null //实例
} /**
* 获得实例
*/
static get instance() {
return !!this._instance ? this._instance : this._instance = new FileStorageQuota()
} /**
* 已经分配的额度和适用查询
* @param {*类型 window.TEMPORAR(0) |window.PERSISTENT(1) } type
*/
queryInfo(type = window.TEMPORARY) { return new Promise((resolve, reject) => {
this.storageQuota.queryInfo(this.supportedTypes[type])
.then(storageInfo => resolve({ quota: this.tansferBytes(storageInfo.quota), usage: this.tansferBytes(storageInfo.usage) }))
.catch(this.errorHandler(reject))
}) } /**
* 请求配额,只有PERSISTENT才需要用户允许,
* 返回值是你请求的和已经分配的大值
* @param {* window.TEMPORAR(0) |window.PERSISTENT(1)} type
* @param {* 请求的配额大小} requestQuota
*/
async requestPersistentQuota(requestQuota = 5) {
let { quota: quotaM, usage } = await this.queryInfo(window.PERSISTENT)
if (requestQuota > quotaM) {
return new Promise((resolve, reject) =>
this.storageQuota.requestPersistentQuota(requestQuota * 1024 * 1024)
.then(storageInfo => {
return resolve({ quota: this.tansferBytes(storageInfo.quota), usage: this.tansferBytes(storageInfo.usage || usage) })
})
.catch(this.errorHandler(reject)))
}
return { quota: Math.max(requestQuota, quotaM), usage }
} /**
* 把bytes换算成KB,M,G等
* @param {* bytes的长度} bytesLength
* @param {* 转为目标的单位} target
*/
tansferBytes(bytesLength, target = 'M') {
let m = {
'Byte': 0,
'KB': 1,
'M': 2,
'G': 3
}
return bytesLength / Math.pow(1024, m[target] || 0)
} /**
* Promise里面的错误处理
* @param {*} reject
*/
errorHandler(reject) {
return (error) => {
reject(error)
}
}
}

测试:

FileStorageQuota.instance.queryInfo().then(data=>console.log(data))

Object {quota: 2767.7421379089355, usage: 22.347068786621094}

  

FileStorageQuota.instance.requestPersistentQuota().then(data=>console.log(data))

Object {quota: 10240, usage: 0}

源码地址:https://github.com/xiangwenhu/BlogCodes/tree/master/client/FileSystem

参考:

Quota Management API

StorageQuota - Web APIs | MDN

File System 定额(配额查询)的更多相关文章

  1. 谷歌三大核心技术(一)The Google File System中文版

    谷歌三大核心技术(一)The Google File System中文版  The Google File System中文版 译者:alex 摘要 我们设计并实现了Google GFS文件系统,一个 ...

  2. File System 之本地文件系统

    上一篇文章提到了,最近做一个基于 File System/IndexedDB的应用,上一篇是定额和使用的查询. 因为LocalFileSystem只有chrome支持,有点尴尬,如果按需加载又何来尴尬 ...

  3. The Google File System 中文版

    摘要 我们设计并实现了Google文件系统,一个面向分布式数据密集型应用的.可伸缩的分布式文件系统.虽然运行在廉价的日用硬件设备上,但是它依然了提供容错功能,为大量客户机提供了很高的总体性能. 虽然与 ...

  4. 【转】谷歌三大核心技术(一)The Google File System中文版

      The Google File System中文版 译者:alex 摘要 我们设计并实现了Google GFS文件系统,一个面向大规模数据密集型应用的.可伸缩的分布式文件系统.GFS虽然运行在廉价 ...

  5. Google File System中文版

    英文原文地址: Google File system 译文原文地址: The Google File System中文版 Google File System中文版 摘要 我们设计并实现了Google ...

  6. The Google File System中文版

    译者:alex 摘要 我们设计并实现了Google GFS文件系统,一个面向大规模数据密集型应用的.可伸缩的分布式文件系统.GFS虽然运行在廉价的普遍硬件设备上,但是它依然了提供灾难冗余的能力,为大量 ...

  7. 大数据理论篇HDFS的基石——Google File System

    Google File System 但凡是要开始讲大数据的,都绕不开最初的Google三驾马车:Google File System(GFS), MapReduce,BigTable. 为这一切的基 ...

  8. The Google File System 翻译和理解

    The Google File System 摘要 GFS 是一个可扩展的分布式文件系统,用于大型分布式数据密集型应用上.它可以运行在便宜的普通硬件上,提供了高性能和一定的容错性. 1. 分布式文件系 ...

  9. 磁盘、分区及Linux文件系统 [Disk, Partition, Linux File System]

    1.磁盘基础知识 1.1 物理结构 硬盘的物理结构一般由磁头与碟片.电动机.主控芯片与排线等部件组成:当主电动机带动碟片旋转时,副电动机带动一组(磁头)到相对应的碟片上并确定读取正面还是反面的碟面,磁 ...

随机推荐

  1. 关于C语言中static保留字的使用

             static存储类型可以用于全部变量,无需考虑变量声明的位置.但是作用于块外部和块内部时具有不同的作用.         (1)当作用于函数内部时,和每次程序离开所在块就会丢失值的自 ...

  2. C++ map multimap

    map multimap map,multimap key-value对容器,也叫字典,map中不能存放key相同的元素,而multimap可以,容器中元素默认按升序排序 map multimap的相 ...

  3. MySQL系列:高可用架构之MHA

    前言 从11年毕业到现在,工作也好些年头,入坑mysql也有近四年的时间,也捣鼓过像mongodb.redis.cassandra.neo4j等Nosql数据库.其实一直想写博客分享下工作上的零零碎碎 ...

  4. 网络基础之 OSI七层模型

    OSI七层模型模型图如下: 前三层(应用层,表示层,会话层)=>给用户提供服务. 后四层(传输层,网络层,数据链路层,物理层)=>数据传递提供服务. 其中 数据链路层中MAC地址负责局域网 ...

  5. django序列化时使用外键的真实值

    展示: 普通情况下序列化得到的外键的内容仅仅是id: ... { fields: { uat_date: "2015-07-25", statu: "CG", ...

  6. mvc 中Range中max和min值晚绑定

    对于Attribute : Range(min,max)的min和max必须在用的时候给,但是需求有时须要把这两个值存db.动态取出的.这时就须要razor帮忙了: @Html.TextBoxFor( ...

  7. webpack入门(2)

    webpack入门(2) ps:每个案例都是基于前一个案例改造的 webpack入门(1) 戳这里 案例源码戳这里 十二.ProvidePlugin 自动加载模块 new webpack.Provid ...

  8. 微信小程序教学第二章(含视频):小程序中级实战教程之预备篇 - 封装网络请求及 mock 数据

    § 封装网络请求及 mock 数据 本文配套视频地址: https://v.qq.com/x/page/i05544fogcm.html 开始前请把 ch2-3 分支中的 code/ 目录导入微信开发 ...

  9. UML2和建模工具学习总结

    软件发展的方向:CS–>BS–>SOA–>BIG DATA 建模的含义: 模型是对现实的简化 从特点视角对系统的一个完整性描述 建模的重要性: 为了更好的理解一个系统 管理复杂度(也 ...

  10. 单源最短路径(1):Dijkstra 算法

    一:背景 Dijkstra 算法(中文名:迪杰斯特拉算法)是由荷兰计算机科学家 Edsger Wybe Dijkstra 提出.该算法常用于路由算法或者作为其他图算法的一个子模块.举例来说,如果图中的 ...