//urlData Data URL import crypt; import fsys.mime; namespace inet; class urlData{ ctor(data,path,mime){ if(!mime){ if(!path) mime = ..fsys.mime.fromData(data); else mime = ..fsys.mime.fromFile(path); if(!mime) error("无效的 MIME",2); } if(!data){ data = path ? ..string.loadBuffer(path); if(!data) error("参数 @1 未指定数据,且参数 @2 未指定有效的文件路径",2); } return ..string.format('data:%s;base64,%s',mime,..crypt.encodeBin(data,,0x40000001/*_CRYPT_STRING_BASE64*/ ) ) }; } urlData.parse = function(url){ if(!type.isString(url)) return; var mime,base64,data = ..string.match(url,"data\:(.*?)(<;base64>?),(.+)"); if(base64){ data = ..crypt.decodeBin(data,, 1/*_CRYPT_STRING_BASE64*/); }; return data,mime; } urlData.fromImage = function(b){ var m; var typeImage = type(b); if((typeImage =="buffer") || (typeImage =="string")){ if( b[1] == 0xFF && b[2] == 0xD8 ){ m="image/jpeg" } elseif( b[1] == 0x89 && b[2] == 0x50 && b[3] == 0x4e && b[4] == 0x47){ m="image/png" } elseif( b[1] == 0x47 && b[2] == 0x49 && b[3] == 0x46){ m="image/gif" } elseif( b[1] == 0x52 && b[2] == 0x49 && b[3] == 0x46 && b[4] == 0x46){ m="image/webp" } else{ if(typeImage =="string"){ if(..io.exist(b)){ b = ..string.loadBuffer(b); if(b) return urlData.fromImage(b); } } return; } return ..string.format('data:%s;base64,%s',m,..crypt.encodeBin(m,,0x40000001/*_CRYPT_STRING_BASE64*/ ) ) } } /*****intellisense() inet.urlData = 生成 Data URL inet.urlData( = 返回 Data URL inet.urlData(.(data,path,mime) = 参数 @1 可指定字符串或 buffer,\n如果为 null 则自参数 @2 指定的路径加载数据。\n参数 @2 指定文件路径,如果用于获取 MIME 可指定并非实际存在的文件名。\n可选指定 MIME,如不指定则自参数 @2 指定的路径获取 MIME。\n标准库函数 crypt.bin.base64DataUrl(data,mime) 提供了类似的功能 inet.urlData.parse( = 解析 Data URL 并返回解析后数据。\n\n此函数功能与 crypt.bin.decodeBase64DataUrl 函数相同。 inet.urlData.parse(.(url) = 如果参数不是字符串返回 null 。\n如果参数是 Data URL,返回解析后的数据与 MIME。\如果数据由 base64 编码则自动解码。 inet.urlData.fromImage(.(imagePathOrBuffer) = 参数 @imagePathOrBuffer 可指定图像文件路径或内存数据(buffer 或字符串),\n如果图像数据为 JPG/PNG/GIF/WEBP 格式则返回 Data URL。\n如果传入错误的参数类型或不支持的图像格式此函数返回 null end intellisense*****/