alex-net/tiny-file-man

实现连接到可视化编辑器TinyMCE5的textarea字段和Responsive FileManager文件管理器的组件

安装: 84

依赖: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 0

类型:yii2-extension

1.0.5 2021-12-23 10:00 UTC

This package is auto-updated.

Last update: 2024-09-25 03:42:47 UTC


README

为了使编辑器与Responsive File Manager文件管理器协同工作,需要下载该管理器的最新版本,并将存档内容放置在服务器上的任何目录中。接下来,需要做一些转换(代码适配)。

发现的问题及其解决方法

工作将在Responsive File Manager存档中的filemanager目录内的文件上进行。

删除config.php

在此目录中,应遍历所有直接位于filemanager目录中的*.php文件,并删除对config.php文件的连接(此文件在操作内部连接)。.. 删除包含以下内容的行

$config = include 'config/config.php';

文件上传修正

为了通过管理器正确地加载文件,需要在upload.php文件中进行修改。为了做到这一点,找到赋值给变量$uploadConfig数组的行,并移除upload_dir键的值中的dirname($_SERVER['SCRIPT_FILENAME']) . '/' . 部分(我们的路径已经是绝对的)

在管理器中查看缩略图

为了在管理器中(缩略图)正确查看图片缩略图,需要在dialog.php文件中找到赋值给变量$src_thumb的代码块,并在该位置之后(尽可能接近布局底部)清除变量$src_thumb$src$mini_srcdocument_root路径,以便文件在服务器上的绝对路径变为相对路径,并变成从web访问该文件的链接。需要注意,$_SERVER['DOCUMENT_ROOT']可能包含符号链接,因此必要时可以将$_SERVER['DOCUMENT_ROOT']包装在realpath()函数调用中。此外,可以指定thumbsPath目录作为绝对路径到任何可写入的目录。可以应用Yii2别名。如果图片缩略图的目标目录无法从web访问,则需要使用包含在变量$thumbsAsset中的Asset进行替换,即用sourcePath替换为baseUrl。在应用Asset之前,请注意AssetManager中的$linkAssets值。此值应等于true;否则,将复制目录,并不会有任何好处。

生成缩略图时内存不足。

还可能遇到在通过管理器上传图片后生成缩略图时内存不足的问题。上传的结果将是内存不足的错误。这种行为与在php.ini中设置memory_limit参数的方式有关。"出厂设置"中可以找到以兆字节(数字后面跟字母M)和千兆字节(数字后面跟字母G)指定此值的选项。但经常遇到内存数量以字节(一组数字)指定的情况,这时需要从filemanager/include/utils.php文件中添加计算变量$memory_limit的函数image_check_memory_usage,为字节表示的内存大小添加计算。
在同一个utils.php文件中,需要将从getimagesize开始的行到条件结束的行包裹在try catch中。如果抛出异常,则返回false。问题是,对于不正确的图片和尺寸为零的图片,getimagesize()函数会抛出异常,而没有人可以捕获这个异常。通过将代码块包裹在try catch中,我们可以捕获这个异常,并防止脚本崩溃。

上传小于100KB的小文件。

也存在一个小文件(约100KB)加载问题。原因是缺少标题 Content-Range。我们将通过修改文件 filemanager/UploadHandler.php 中的 post() 方法来解决这个问题:如果变量 $content_range 的值是 null,我们将给它赋值一个数组 [0,$size,$size],其中 $size 是上传文件的尺寸。

界面翻译

为了支持界面翻译,需要在文件 include/utils.php 的开头添加一个全局变量 $lang_vars

    global $lang_vars; 

通过链接上传文件。

在从外部来源(通过URL)上传文件时发现了一个问题。在这种情况下,PHP 不认为从外部(另一个服务器)加载的文件是 POST 请求加载的文件,并且不会将文件保存在磁盘上。在页面加载时,除了清除包含指定图片链接的地址字段外,没有发生任何操作。为了修复这个错误,需要在文件 /filemanager/UploadHandler.php 中的 handle_file_upload() 函数中添加一个额外的条件来检查是否存在从另一个服务器上传的“临时”文件。如果文件存在,则使用 file_put_contents() 将文件复制到指定位置。在这种情况下,调用将类似于最后一个 else 中的 file_put_contents() 调用,但文件来源将是上传的文件,路径可能存储在 $uploaded_file 中(需要检查 file_exists())。为此,可以使用 rename() 函数。
同时,在文件 upload.php 的第 89 行(将上传文件的数据数组赋值给 $_FILES['files'])中,需要将字段类型 - 从 null 更改为通过 curl 上传的文件中的 mime 类型 mime_content_type($temp)

与 FTP 相关的修正

通过 ftp 管理器工作需要以下代码修正

  • 从函数 ftp_con() 开始,在文件 include/utils.php 中删除所有与 ftp 包装相关的文件包含。其实现在扩展中连接到 nicolab/php-ftp-client 包。
  • 在文件 execute.php 中的 if (isset($_GET['action'])) 之前添加以下行
    # таким образом мы расширим путь до корня ftp ... 
    if ($ftp && !empty($config['ftp_base_folder']) && $path) {
        $path = DIRECTORY_SEPARATOR . $config['ftp_base_folder'] . $path;
    }
  • 在文件 include/unils.php 中的函数 url_exists() 添加通过 curl_close() 释放资源的代码
  • 如果需要生成缩略图但它们不存在,则需要将以下代码添加到相应的位置
    • 文件 include/utils.php 中的函数 create_img() 扩展了一个参数:在列表末尾添加了 $ftp = null
    • 将检查 isset($config['ftp_host']) && $config['ftp_host'] 替换为 $ftp(如果变量不为空,则继续);
    • 在文件 dialog.php 的条件 if(in_array($file_array['extension'], $config['ext_img'])){ 中,对于 $ftp 需要插入生成缩略图的功能,类似于为本地目录执行的操作,但路径应不同。最终结果可能如下
        if (!in_array($file, $filesThumbs)) {
        	$creation_thumb_path = '/' . $config['ftp_base_folder'] . $config['ftp_thumbs_dir'] . $subdir . $file;
            if (!create_img($src, $creation_thumb_path, 122, 91, 'crop', $config,$ftp)) { 
                $src_thumb = $mini_src = "";
            }
        }
  • 在文件 execute.php 中,在代码块 case 'rename_folder':(重命名目录)中,检查路径类型的条件(如果是目录)需要添加以使此条件仅在不存在 ftp 连接时触发=只能对本地文件进行抱怨 ..
  • 为了从外部来源加载图片,需要改进之前在文件 UploadHandler.php 中为本地文件所做的修改。现在,我们将使用一个条件运算符来检查 ftp 连接的存在,而不是使用 rename($uploaded_file, $file_path);
    if (empty($this->options['ftp'])) {
        rename($uploaded_file, $file_path);
    } else {
        $fn = $this->options['storeFolder'] . fix_filename(basename($file_path), $this->options['config']);
        $this->options['ftp']->put($fn, $uploaded_file, FTP_BINARY);
    }
  • 需要将 include/utils.php 中的函数 create_folder() 补充为 ftp 的递归目录创建 = 调用中的第二个参数 $ftp->mkdir = true;

更快地修改

另一种快速修改的方法是下载 9.14 Responsive File Manager 的版本,并在解压后的存档(在目录 responsive_filemanager 中)中初始化一个新的 git 仓库,创建基本提交,并应用名为 for-yii2.patch 的补丁。执行这些操作后,应该一切正常 ..

php8

只有用于转换图片的库文件在 php8 上会出错。该库的更新版本可在以下链接中找到 链接

连接

要使用文本编辑器而不使用文件管理器,只需使用小部件 TinyMCEWidget (\AlexNet\TinyFileMan\widgets\TinyMCEWidget),并将字段 $whithRfm 设置为 false(默认情况下,文件管理器已启用)。小部件可以独立工作(生成 textarea 控件元素),也可以作为表单的一部分(也生成 textarea 标签)。

要与小部件一起使用文件管理器,需要

  • 将模块 FileManMod (TinyFileMan\FileManMod) 连接到项目中,并将其添加到预加载(bootstrap)中,以便形成文件管理器的访问路径。
  • 编写文件管理器的配置(访问路径),这些配置在模块的设置中指定(字段 baseRFMUrls),以及文件管理器在服务器上的文件位置(字段 RFMlink - 支持别名)。

还可以通过字段 $editorConfig 设置编辑器的通用配置。编辑器的访问权限由关联数组预定义,键是类似于为 urlManager 设置的路径,值是包含 perms、uploadPath 和 thumbsPath 键的数组。使用 perms 可以限制对文件管理器的访问,而 uploadPath 和 thumbsPath 通过绝对路径或别名设置上传文件和缩略图的位置。路径必须可以通过 web 访问,因此必须以别名 @webroot 开头。

设置完上述配置后,可以使用参数 $for 连接小部件,该参数传递一个数组,第一个元素是配置中指定的 baseRFMUrls(路径模式)的关键字,其余参数(如果有)用于通过 \yii\helpers\Url::to() 形成特定链接。