files.photo.gallery8.0破解手记
一、Files—单文件 PHP文件、相册管理器
详情内容
Files是一个单文件的PHP应用程序,可以将其放置在服务器上的任何目录中,从而立即创建文件和文件夹的库。它支持所有文件类型,并允许您预览图像,视频,音频和代码。
Files 是一个单文件 PHP 应用程序,可以放入服务器上的任何文件夹,立即创建文件和文件夹库。它支持所有文件类型,并允许您预览图像、视频、音频和文本文件。
无需复杂安装即可即时浏览文件和文件夹。
与客户、朋友和家人方便地共享文件和照片。
用作您网站的简单而美丽和现代的画廊。
直接在服务器上上传和管理文件和文件夹,无需使用 FTP
开源免费PHP写的目录列表源码Files,漂亮适合图片展示
最近更新了0.8版本,更新后破解试试,只为学习,不为其他
二、破解
1.js本地化
还是依旧打开“index.php”,拉到最后,找到这个循环:line:1985-2009
<?php
// load _files/js/custom.js if exists
get_include('js/custom.js');
// load all Javascript assets
foreach (array_filter([
'toastify-js@1.12.0/src/toastify.min.js',
'sweetalert2@11.7.20/dist/sweetalert2.min.js',
'animejs@3.2.1/lib/anime.min.js',
'@exeba/list.js@2.3.1/dist/list.min.js',
'yall-js@3.2.0/dist/yall.min.js',
'filesize@9.0.11/lib/filesize.min.js',
'screenfull@5.2.0/dist/screenfull.min.js',
'dayjs@1.11.9/dayjs.min.js',
'dayjs@1.11.9/plugin/localizedFormat.js',
'dayjs@1.11.9/plugin/relativeTime.js',
(in_array(config::$config['download_dir'], ['zip', 'files']) ? 'js-file-downloader@1.1.25/dist/js-file-downloader.min.js' : false),
(config::$config['download_dir'] === 'browser' ? 'jszip@3.10.1/dist/jszip.min.js' : false),
(config::$config['download_dir'] === 'browser' ? 'file-saver@2.0.5/dist/FileSaver.min.js' : false),
'codemirror@5.65.14/mode/meta.js',
'files.photo.gallery@' . config::$version . '/js/files.js'
//'./js/files.js'
]) as $key) echo '<script src="' . config::$assets . $key . '"></script>';
?>
以上是用到的所有js文件,全部托管在https://cdn.jsdelivr.net上,从代码中看出,实际地址
'<script src="' . config::$assets . $key . '"></script>';
实际上就是$assets
变量加$key变量,加 ‘files.photo.gallery@’ ,再加config::$version(版本号变量),再加 ‘/js/files.js’
中间有些变量:line:123-142,其中用到的变量:$version=0.8.4、
// app vars
static $__dir__ = __DIR__;
static $__file__ = __FILE__;
static $version = '0.8.4';
static $root;
static $doc_root;
static $has_login = false;
static $storage_path;
static $storage_is_within_doc_root = false;
static $storage_config_realpath;
static $storage_config;
static $cache_path;
static $image_resize_cache_direct;
static $image_resize_dimensions_retina = false;
static $dirs_hash = false;
static $local_config_file = '_filesconfig.php';
static $username = false;
static $password = false;
static $x3_path = false;
static $assets;
0.8.4版本的所有JS地址:
https://cdn.jsdelivr.net/npm/toastify-js@1.12.0/src/toastify.min.js
https://cdn.jsdelivr.net/npm/sweetalert2@11.7.20/dist/sweetalert2.min.js
https://cdn.jsdelivr.net/npm/animejs@3.2.1/lib/anime.min.js
https://cdn.jsdelivr.net/npm/@exeba/list.js@2.3.1/dist/list.min.js
https://cdn.jsdelivr.net/npm/yall-js@3.2.0/dist/yall.min.js
https://cdn.jsdelivr.net/npm/filesize@9.0.11/lib/filesize.min.js
https://cdn.jsdelivr.net/npm/screenfull@5.2.0/dist/screenfull.min.js
https://cdn.jsdelivr.net/npm/dayjs@1.11.9/dayjs.min.js
https://cdn.jsdelivr.net/npm/dayjs@1.11.9/plugin/localizedFormat.js
https://cdn.jsdelivr.net/npm/dayjs@1.11.9/plugin/relativeTime.js
https://cdn.jsdelivr.net/npm/js-file-downloader@1.1.25/dist/js-file-downloader.min.js
https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js
https://cdn.jsdelivr.net/npm/file-saver@2.0.5/dist/FileSaver.min.js
https://cdn.jsdelivr.net/npm/codemirror@5.65.14/mode/meta.js
https://cdn.jsdelivr.net/npm/files.photo.gallery@0.8.4/js/files.js
循环中改为相对地址(本地相对地址)。
foreach (array_filter([
'js/toastify.min.js',
'js/sweetalert2.min.js',
'js/anime.min.js',
'js/list.min.js',
'js/yall.min.js',
'js/filesize.min.js',
'js/screenfull.min.js',
'js/dayjs.min.js',
'js/localizedFormat.js',
'js/relativeTime.js',
(in_array(config::$config['download_dir'], ['zip', 'files']) ? 'js/js-file-downloader.min.js' : false),
(config::$config['download_dir'] === 'browser' ? 'js/jszip.min.js' : false),
(config::$config['download_dir'] === 'browser' ? 'js/FileSaver.min.js' : false),
'js/meta.js',
'js/files.js'
]) as $key) echo '<script src="' . $key . '"></script>';
2。去除授权弹窗
这个files.js是一个非格式化的代码文件,太伤心,要慢慢找弹窗函数。
先看弹窗的内容,查找弹窗内容所在函数,将本函数注释掉即可:
/*
function n(e){
J=!1;var t,i=(e?'<div class="alert alert-danger" role="alert"><strong>Invalid license</strong><br>You have entered an invalid license key.</div>':"")+'<div id="pay"><div id="pay_info"><strong class="license-header">Purchase a <a href="https://www.files.gallery/docs/license/" target="_blank" tabIndex="-1">license</a> to unlock features!</strong><a class="license-small" href="https://www.files.gallery/" target="_blank" tabIndex="-1">www.files.gallery</a>\t\t'+(t='<div class="license-features">',["Remove this popup","Upload","Download folder zip","Code and text editor","Create new file","Create new folder","Rename","Delete","Duplicate file","Panorama viewer","Dedicated support","More features coming!"].forEach((function(e){t+='<div class="license-feature">'+F.get_svg_icon("check")+e+"</div>"})),t+'</div><div class="license-small">* After purchase, you will receive <strong>license key</strong> by email.</div><a href="https://license.files.gallery/')+(location.search.includes("test=1")?"?test=1":"")+'" target="_blank" class="btn btn-success text-light" id="buy_button" tabIndex="-1">BUY LICENSE<span class="buy-button-price">$39.00</span></a>\t\t</div></div>\t\t<form id="license_form" novalidate>\t\t\t<input id="license_key" class="form-control" type="text" placeholder="LICENSE-KEY" tabIndex="-1" required>\t\t\t<button id="continue_free" type="button" class="btn btn-light">No thanks!</button>\t\t\t<button id="license_save_button" type="submit" class="btn btn-success text-light" style="display:none;">Save</button>\t\t</form>',a=(Swal.fire({html:i,width:"30em",showConfirmButton:!1,customClass:{popup:"license-popup",htmlContainer:"license-container"},didOpen:setTimeout(q,100)}),_id("license_form")),n=a.parentNode,o=_id("buy_button"),l=_id("license_key"),s=_id("license_save_button"),r=_id("continue_free"),c=_id("pay"),p=new RegExp(S("XkYxLVtBLVowLTldezR9LVtBLVowLTldezR9LVtBLVowLTldezR9LVtBLVowLTldezR9LVtBLVowLTldezR9LVtBLVowLTldezR9JA=="));function d(e){n.style.cssText=e?"pointer-events:none;opacity:.5":""}function m(e){var t=l.value.trim(),i=t&&p.test(t),a="submit"===e.type;l.classList.toggle("is-valid",i),l.classList.toggle("is-invalid",(t||a)&&!i),s.style.display=i?"":"none",r.style.display=i?"none":"",a&&(e.preventDefault(),e.stopPropagation(),i&&(d(1),T({params:S("YWN0aW9uPWxpY2Vuc2Uma2V5PQ")+t,json_response:!0,complete:function(e,t,i){i&&e.success?(J=!0,ie.fire("License saved!")):(d(0),alert("Failed to save license key"))}})))}o.addEventListener("click",(e=>{var t=_h.popup(e,800,1e3,o.href,"buy");window.addEventListener("message",(e=>{e.source===t&&/^https:\/\/.*(files|photo)\.gallery/.test(e.origin)&&(c.innerHTML="<p>Thanks for purchasing! Please "+(e.data?"save your license key":"check your email")+".</p>",e.data?(l.value=e.data,l.dispatchEvent(new Event("input",{bubbles:!0})),s.focus()):l.focus())}),!1)})),w(r,(e=>Swal.close())),w(a,m,"input"),w(a,m,"submit")}
*/
回到浏览器刷新,因为有缓存,依然还是有弹窗,弹窗不在。
可能要多刷新几次,或者强刷。
3. css文件本地化
将files.css下载到css/files.css,理论上可大幅提升呈现速度
356行
wget https://cdn.jsdelivr.net/npm/files.photo.gallery@0.8.4/css/files.css
bash复制代码1
<!--link href="<?php echo config::$assets ?>files.photo.gallery@<?php echo config::$version ?>/css/files.css" rel="stylesheet"-->
#改为:
<link href="css/files.css" rel="stylesheet">
复制代码123
将https://cdn.jsdelivr.net/npm/files.photo.gallery@0.8.4/css/files.css,下载到css/files.css
配置相关参数
路径
参数 | 解释说明 |
---|---|
‘root’ => ‘ ‘ | 可以填写相对路径或者绝对路径,不填代表当前目录 |
‘start_path’ => false | 分配加载到视图中的第一个目录,默认情况下,该目录与root目录相同。 它可以是相对路径,也可以是绝对路径,但是该路径必须在根目录下。 |
登录
参数 | 解释说明 |
---|---|
‘username’ => ‘ ‘ | 添加用户名,以通过登录保护您的“文件”应用程序。 |
‘password’ => ‘ ‘ | 添加密码,以通过登录保护您的“文件”应用程序。 需要使用该工具进行加密 |
图片
参数 | 解释说明 |
---|---|
‘load_images’ => true | 如果禁用,则不显示缩略图。 |
‘load_files_proxy_php’ => false | 如果无法通过URL(由于任何原因)访问图像,则强制通过PHP代理加载图像。 |
‘load_images_max_filesize’ => 1000000 | 可直接加载到图库中的最大图像文件大小。 如果文件大小超过此值,它将被文件图标代替。 不会影响有效调整尺寸的图像。 这样做的目的是防止大量图像直接加载到图库布局中,从而导致加载缓慢和界面呆滞卡顿,这样会很影响体验。 |
‘load_svg_max_filesize’ => 100000 | 最大SVG文件大小,可直接加载到图库中。 如果文件超过该值,它将被文件图标代替。 这样做的目的是防止复杂的SVG形状缓慢渲染并导致缓慢的界面。 |
‘image_resize_enabled’ => true | 允许调整加载到图库中的图像的大小。 |
‘image_resize_cache’ => true | 允许缓存调整大小的图像以提高加载速度。 调整大小的图像通常会缓存在_files/cache/images/* 的storage_path 中。 |
‘image_resize_dimensions’ => 320 | 默认图像调整尺寸。 适合调整大小的图像的图像宽度,因此它们在所有“文件”库布局中看起来都不错。 |
‘image_resize_dimensions_retina’ => 480 | 服务器用于高密度屏幕(视网膜)的较大图像调整尺寸。 这将为视网膜屏幕生成更高质量的图像,但最终将导致图像缓存大小增加一倍。 如果不需要,设置为false。 |
‘image_resize_quality’ => 85 | JPG压缩级别,用于调整大小的图像。 |
‘image_resize_function’ => ‘imagecopyresampled’ | PHP图像调整大小函数。 之间选择 imagecopyresampled(平滑)和 imagecopyresized(快点)。 质量差异很小,但是imagecopyresampled的质量更高,而imagecopyresize的速度则快两倍。 例如,如果要在不使用缓存时更快地调整大小,则可以使用imagecopyresize。 这是勿埋我心的参考,具体可以自己比较一下。 |
‘image_resize_sharpen’ => true | 创建更清晰(模糊程度较小)的预览图像。 |
‘image_resize_memory_limit’ => 128 | 在调整大图像大小时,临时增加PHP内存限制(如果需要)。 默认值设置为128 MB,这可以将图像调整为最大〜6000 px。 如果您的PHP memory_limit 已经高于该值,则将无效。 |
‘image_resize_max_pixels’ => 30000000 | 设置调整图像大小的最大允许尺寸。 默认值为30000000(30兆像素),它允许将图像的大小调整为大约6000 x 5000像素。 可以使用此选项来防止服务器尝试将图像大小调整为超出功能范围和/或防止性能降低。 勿埋我心建议这个也调大,默认值是超过大约6000 x 5000像素的图片就不进行缩略生成。 |
‘image_resize_min_ratio’ => 1.5 | 图像调整大小目标尺寸和原始图像尺寸之间的最小比率差。 如果原始图像仅比调整大小目标大X倍,则将使用原始图像。 在大多数情况下,如果原始图像仅比调整大小的目标稍大,则创建调整大小的版本是没有意义的。 |
‘image_resize_cache_direct’ => false | 将尝试绕过Files PHP应用程序将缓存的调整大小后的图像直接加载到图库中。 由于图像文件直接加载到浏览器中,因此可能会导致更快的加载和改进的浏览器缓存。 但是,如果启用此选项并删除图像缓存,则可能会丢失图像文件,因为“文件”应用程序不用于检测是否存在缓存的请求。 如果启用此选项,并且您确实要删除图像缓存,则需要将cache_key 设置增加+1。 勿埋我心建议:将此项设置为true,可以使缩略图使用真实路径,有利于CDN缓存,如果你没有CDN,那么没太大关系。 |
菜单
参数 | 解释说明 |
---|---|
‘menu_enabled’ => true | 启用或禁用左侧文件夹菜单。 您仍然可以从主视图区域中浏览文件夹。 如果根目录不包含任何文件夹,则该菜单将始终被禁用。 |
‘menu_show’ => true | 默认情况下,切换左文件夹菜单已展开或折叠。 如果根目录中没有文件夹或禁用了菜单,则此设置无效。 同样,该值由浏览器“记住”,并且将始终默认为每个浏览器菜单所处的最后状态。 |
‘menu_max_depth’ => 5 | 作为预防措施,左侧菜单的深度限制为5个子文件夹级别。 在许多情况下,将无限数量的子文件夹加载到菜单中是没有用的,因为它会很慢,并且在菜单界面中可能无法很好地显示。 勿埋我心建议您可以轻松地将该值增加到更高的值,但是请注意,如果要加载巨大的根目录,则加载整个树的速度可能很慢。 例如,如果要加载服务器的整个根,那么加载整个树将是一项艰巨的任务。您仍然可以直接从查看区域导航到更深的文件夹级别。 |
‘menu_sort’ => ‘name_asc’ | 选择如何使用选项name_asc,name_desc,date_asc和date_desc对文件夹菜单项进行排序 。 |
‘menu_cache_validate’ => true | 启用时(默认),将验证菜单缓存以确保其与实际的文件夹结构匹配。 通常,此机制是必需的,以确保对您所做的任何更改(新文件夹等)与菜单缓存文件进行验证。 如果禁用,则仅针对根文件夹和1级文件夹验证缓存。 如果您的永久文件库具有较重的文件夹结构,则禁用此功能可能很有用,在这种情况下,菜单的加载速度会更快。 请记住,如果您禁用此功能然后在子文件夹中进行更改,则需要删除菜单缓存或增加cache_key 值。 |
‘menu_load_all’ => false | 将导致菜单预加载所有页面,包括所有文件数据。 这意味着菜单加载后,您可以立即浏览所有文件夹,而无需进行任何加载。 此功能对于永久画廊或简单的根文件夹结构很有用。 |
‘menu_recursive_symlinks’ => true | 在主菜单中列出符号链接的子目录。可能会导致无害的菜单循环或重复的菜单项。 |
布局
参数 | 解释说明 |
---|---|
‘layout’ => ‘rows’ | 默认画廊布局,包括选项 列表,块,网格,行和列。 该值由浏览器“记住”,并且将始终默认为访问者选择的最后一个状态。 |
‘image_cover’ => true | 在其容器内缩放图像以进行某些布局,以填充整个网格区域。某些作物会发生。 该值由浏览器“记住”,并且将始终默认为访问者选择的最后一个状态。 |
‘sort’ => ‘name_asc’ | 在主视图区域中对文件的默认排序,带有选项 name,date,filesize和k i nd。 该值由浏览器“记住”,并且将始终默认为访问者选择的最后一个状态。 |
‘sort_dirs_first’ => true | 启用后,总会在最上方列出目录,这通常是最直观的。 |
缓存
参数 | 解释说明 |
---|---|
‘cache’ => true | 启用后,将为文件夹和菜单创建缓存。 缓存是在storage_path 中创建的,通常是_files/cache/folders 和_files/cache/menu 。 如果您不希望“文件”应用程序创建任何缓存文件,请禁用此选项。 例如,如果您只打算使用它一次并删除它。请记住,启用缓存后,“文件”应用程序加载速度会更快。 |
‘cache_key’ => 0 | 菜单缓存和文件夹缓存与cache_key。 如果您出于任何原因要强制刷新缓存,可以将cache_key增加+1。 |
‘storage_path’ => ‘_files’ | storage_path定义“文件”应用将在何处创建缓存文件夹,配置和插件。 在大多数情况下,应始终使用默认值“ _files ”。 在某些情况下,如果您不想将数据写入当前目录,或者有多个共享相同存储路径(和缓存)的“文件”应用程序,则可能需要使用不同的storage_path 。 存储路径可以是相对的或绝对的。 |
排除显示文件
参数 | 解释说明 |
---|---|
‘files_exclude’ => ‘ ‘ | 一个PHP正则表达式,用于排除或包含文件。 通常用于排除某些文件类型,或仅包括某些扩展名。 适用于所有文件的基本名称。 |
‘dirs_exclude’ => ‘ ‘ | 一个PHP正则表达式来排除目录。 适用于所有目录和文件的根相对路径。 |
‘allow_symlinks’ => true | 允许“文件”应用显示和跟随列表和菜单中的符号链接。 |
其它
参数 | 解释说明 |
---|---|
‘history’ => true | 启用历史记录后,浏览器将在导航目录时更改URL?path/to/folder 。 这还允许您在共享URL时直接直接深链接到文件和目录。 如果禁用,则导航时URL永远不会改变。 |
‘breadcrumbs’ => true | 启用顶部栏中的“ breadcrumbs”界面元素,使用户可以轻松导航至父目录。 如果root不包含任何文件夹,则将始终禁用。 |
‘transitions’ => true | 启用前端的各种转换。 |
‘click’ => ‘popup’ | 单击主视图区域中的项目时, 选择触发弹出窗口, 模式, 下载, 窗口 或 菜单(popup, modal, download, window or menu)的方法。 默认值“popup”将适用于所有图像文件,但对于非图像文件将回退为“modal”。 |
‘code_max_load’ => 100000 | 直接在“文件”代码编辑器中加载和显示的代码文件(PHP,JS,CSS等)的最大文件大小。 对于大型文件,代码编辑器可能会比较迟钝,并且自动将它们加载到编辑器中并没有用。 |
‘code_allow_edit’ => false | 允许直接从“文件”应用程序代码编辑器编辑代码文件。 |
‘popup_interval’ => 5000 | 设置弹出幻灯片的时间间隔。 |
‘topbar_sticky’ => ‘scroll’ | 选择topbar 如何使用true,false和’scroll’选项将其自身附加到屏幕上。 |
‘check_updates’ => true | 检查“文件”应用程序更新。如果“文件”应用程序有更新,则在右上方显示“钟形”图标。 |
‘allow_tasks’ => true | 尚未记录或可公开使用。 |
‘get_mime_type’ => false | 从服务器(慢)而不是扩展名(快速)获取文件mime类型。 |
‘context_menu’ => true | 禁用上下文菜单按钮和右键单击菜单。 |
‘prevent_right_click’ => false | 阻止浏览器右键单击敏感项目(图像,列表项,菜单)上的菜单。 |
‘license_key’ => ‘ ‘ | 在此处插入许可证密钥以防止许可证弹出和解锁功能。 |
更多参数
详情请看 👉 传送门
使用插件(非必选)
一、下载插件
下载地址:https://cdn.jsdelivr.net/gh/qiantigers/files.photo.gallery@1.1/_files/plugins/tasks.php
二、安置tasks.php
将其放到_files/plugins/
三、使用方法
1. ?task=
放在链接后,举个例子:https://list.yiove.com/?task=
2. create_cache / menu / folders / images / all / force / dir / ignore_max_depth / time_limit
缓存设置,比如缓存所有图片缩略图,举个例子:https://list.yiove.com/?task=create_cache&images
3. clear_cache / menu / folders / images / all / force / time_limit
清除缓存,比如删除图片缓存,举个例子:https://list.yiove.com/?task=clear_cache&images
4. create_html
缓存html,举个例子:https://list.yiove.com/?task=create_html
下载地址:
https://wwsx.lanzouu.com/b058ofusb
密码:7cei
files.photo.gallery0.9.12 去弹窗方式
一、文件本地化:
打开index.php,找到2296行:foreach循环:
foreach (array_filter([
'toastify-js@1.12.0/src/toastify.min.js',
'sweetalert2@11.12.3/dist/sweetalert2.min.js',
'animejs@3.2.2/lib/anime.min.js',
'yall-js@3.2.0/dist/yall.min.js',
'filesize@9.0.11/lib/filesize.min.js',
'screenfull@5.2.0/dist/screenfull.min.js',
'dayjs@1.11.12/dayjs.min.js',
'dayjs@1.11.12/plugin/localizedFormat.js',
'dayjs@1.11.12/plugin/relativeTime.js',
(in_array(Config::get('download_dir'), ['zip', 'files']) ? 'js-file-downloader@1.1.25/dist/js-file-downloader.min.js' : false),
'file-saver@2.0.5/dist/FileSaver.min.js',
'jszip@3.10.1/dist/jszip.min.js',
'codemirror@6.65.7/mode/meta.js',
'files.photo.gallery@' . Config::$version . '/js/files.js'
]) as $key) echo '<script src="' . U::assetspath() . $key . '"></script>' . PHP_EOL;
?></body></html><?php
// end HTML
}
看到其中as $key) echo '<script src="' . U::assetspath() . $key . '">
实际也就是U::assetspath
加数组内的内容,就是实际地址,
再找到assetspath代表的内容(607行):
private static $assetspath;
public static function assetspath(){
if(self::$assetspath) return self::$assetspath;
return self::$assetspath = Config::get('assets') ? rtrim(Config::get('assets'), '/') . '/' : 'https://cdn.jsdelivr.net/npm/';
}
可以看到地址就是:https://cdn.jsdelivr.net/npm/
那么以上JS的地址就是https://cdn.jsdelivr.net/npm/加数组内的相关内容
wget https://cdn.jsdelivr.net/npm/toastify-js@1.12.0/src/toastify.min.js
wget https://cdn.jsdelivr.net/npm/sweetalert2@11.12.3/dist/sweetalert2.min.js
wget https://cdn.jsdelivr.net/npm/animejs@3.2.2/lib/anime.min.js
wget https://cdn.jsdelivr.net/npm/yall-js@3.2.0/dist/yall.min.js
wget https://cdn.jsdelivr.net/npm/filesize@9.0.11/lib/filesize.min.js
wget https://cdn.jsdelivr.net/npm/screenfull@5.2.0/dist/screenfull.min.js
wget https://cdn.jsdelivr.net/npm/dayjs@1.11.12/dayjs.min.js
wget https://cdn.jsdelivr.net/npm/dayjs@1.11.12/plugin/localizedFormat.js
wget https://cdn.jsdelivr.net/npm/dayjs@1.11.12/plugin/relativeTime.js
wget https://cdn.jsdelivr.net/npm/js-file-downloader@1.1.25/dist/js-file-downloader.min.js
wget https://cdn.jsdelivr.net/npm/file-saver@2.0.5/dist/FileSaver.min.js
wget https://cdn.jsdelivr.net/npm/jszip@3.10.1/dist/jszip.min.js
wget https://cdn.jsdelivr.net/npm/codemirror@6.65.7/mode/meta.js
wget https://cdn.jsdelivr.net/npm/files.photo.gallery@0.9.12/js/files.js
将JS文件下载到js文件夹
再将以上数据修改成:
foreach (array_filter([
'js/toastify.min.js',
'js/sweetalert2.min.js',
'js/anime.min.js',
'js/yall.min.js',
'js/filesize.min.js',
'js/screenfull.min.js',
'js/dayjs.min.js',
'js/localizedFormat.js',
'js/relativeTime.js',
(in_array(Config::get('download_dir'), ['zip', 'files']) ? 'js/js-file-downloader.min.js' : false),
'js/FileSaver.min.js',
'js/jszip.min.js',
'js/meta.js',
'js/files.js'
]) as $key) echo '<script src="' . $key . '"></script>' . PHP_EOL;
?></body></html><?php
// end HTML
}
二、去弹窗
依旧将js/files.js
中的弹窗函数注释掉,先查找弹窗内容
/*
function n(e){ee=!1;const t=new RegExp(T("XkYxLVtBLVowLTldezR9LVtBLVowLTldezR9LVtBLVowLTldezR9LVtBLVowLTldezR9LVtBLVowLTldezR9LVtBLVowLTldezR9JA==")),i=e=>{let i=e||Swal.getInput().value.trim();return i&&t.test(i)};let a="";["Remove this popup","Upload, delete, move, copy, rename, zip and unzip","Create new files and folders","Mass download selected files and folders","Advanced code and text editor","Panorama photo viewer","Dedicated support"].forEach((e=>{a+=`<div class="license-feature">${F.get_svg_icon("check")}${e}</div>`}));const n=location.search.includes("test=1")?"&test=1":"",o=`<div class="license-types-container"><div class="license-types">\n\t\t\t<div class="license-type license-type-personal">\n\t\t\t\t<h2 class="license-type-title">Personal</h2>\n\t\t\t\t<p class="license-type-description">For usage on your own personal websites, or for a single client website.</p>\n\t\t\t\t<a class="button button-success license-type-button" href="https://license.files.gallery/?type=personal${n}" target="_blank" tabindex="-1">$39.00</a>\n\t\t\t</div>\n\t\t\t<div class="license-type license-type-unlimited">\n\t\t\t\t<h2 class="license-type-title">Unlimited</h2>\n\t\t\t\t<p class="license-type-description">Unlimited usage for yourself and all your client websites and projects.</p>\n\t\t\t\t<a class="button button-success license-type-button" href="https://license.files.gallery/?type=unlimited${n}" target="_blank" tabindex="-1">$79.00</a>\n\t\t\t</div>\n\t\t</div>\n\t\t<small class="license-types-footer">* Features are identical, see <a href="https://www.files.gallery/docs/license/#license-types" target="_blank" class="license-types-link">license types</a>.</small>\n\t\t</div>`;me.prompt.fire({html:`<div class="license-container"><div class="license-header">${e?'<div class="alert alert-danger" role="alert"><strong>Invalid license</strong><br>You have entered an invalid license key.</div>':""}<div class="license-title">Purchase a <a href="https://www.files.gallery/docs/license/" target="_blank" tabIndex="-1">license</a> to unlock features!</div><small><a href="https://www.files.gallery/" target="_blank" tabIndex="-1">www.files.gallery</a></small></div><div class="license-features">${a}</div>${o}</div>`,customClass:{popup:"license-popup",confirmButton:"button button-success",cancelButton:"button button-secondary",input:"input"},inputAutoFocus:!0,showConfirmButton:!1,confirmButtonText:K.get("save"),cancelButtonText:"No thanks!",inputPlaceholder:"LICENSE-KEY",allowEnterKey:()=>document.activeElement!==Swal.getInput()||i(),preConfirm:e=>{if(!i(e))return!1},didOpen:e=>{const t=Swal.getConfirmButton(),a=Swal.getCancelButton(),n=Swal.getInput(),o=()=>{let e=n.value.trim(),o=i(e);n[(e?"set":"remove")+"Attribute"]("aria-invalid",!o),t.style.display=o?"inline-block":"none",a.style.display=o?"none":"inline-block"};w(n,(()=>o()),"input"),_query(".license-types").addEventListener("click",(e=>{if(!e.target.href)return;let t=_h.popup(e,800,1e3,e.target.href,"buy");window.addEventListener("message",(e=>{e.source===t&&/^https:\/\/.*(files|photo)\.gallery/.test(e.origin)&&(Swal.getHtmlContainer().firstElementChild.innerHTML=`<div class="license-header"><div class="license-title">Thanks for purchasing!</div><p style="margin:.5rem 0">Please ${e.data?"save your license key":"check your email"}.</p></div>`,e.data&&(n.value=e.data.trim(),o()),window.focus(),n.focus())}),!1)})),setTimeout(R,1e3)}}).then((e=>{if(!e.isConfirmed||!e.value)return;let t=q.loader("Saving license");j({params:T("a2V5PQ==")+e.value,url:_c.script+"?action=save_license",json_response:!0,always:()=>t.hideToast(),complete:(e,t,i)=>{ee=!(!i||!e.success),q.toggle(ee,ee?"License saved!":"Failed to save license key.")},fail:e=>q.toggle(!1,"Error")})}))}
*/
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 vault@coolxy.cn