File System 定额(配额查询)

小编 2026-06-05 阅读:1916 评论:0
不多说,在弄一个基于FileSytem/IndexedDB的小应用,目前处于基础开发阶段,我们在...

不多说,在弄一个基于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

版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表