ondrs/upload-manager

Nette 框架的上传管理器

v8.0 2021-11-22 14:19 UTC

README

Total Downloads CircleCI Latest Stable Version

Nette 框架的上传管理器

安装

composer.json

"ondrs/upload-manager": "v8.0.0"

配置

注册扩展

extensions:
    uploadManager: ondrs\UploadManager\DI\Extension

最小配置

uploadManager:
    relativePath: '/uploads'

完整配置

uploadManager:
    basePath: %wwwDir%
    relativePath: '/uploads'
    fileManager:
        blacklist: {php}
    imageManager:
        maxSize: 1280
        type: jpg
        quality: 80
        saveOriginal: FALSE
        dimensions:
            800:
                - {800, NULL}
                - shrink_only
            500:
                - {500, NULL}
                - shrink_only
            250:
                - {250, NULL}
                - shrink_only
            thumb:
                - {100, NULL}
                - shrink_only

在大多数情况下,您希望选择 wwwDir 作为您的 basePath(默认选择),以便使您的文件公开可访问。relativePath 是相对于 basePath 的,因此您的文件将上传到的完整路径如下所示

{basePath}/{relativePath}[/{dir}]

dir 是一个可选参数,您可以在脚本的运行时通过 listen() 或在 upload() 方法中设置它。

文件管理器

  • 黑名单
    • 黑名单中的文件扩展名数组,默认为 php

图像管理器

  • maxSize

    • 图像的最大大小,如果它更大,它将被自动调整到这个大小
    • 可以是图像的 X 坐标
    • 或数组 [X, Y]
  • 尺寸

    • 要调整图像大小的尺寸数组

    • 格式是

      PREFIX:
          - {X_SIZE, Y_SIZE}
          - RESIZE_OPTION
    • PREFIX 可以是您想要的任何内容,它将被添加到调整大小的文件中:PREFIX_file.jpg

    • Y_SIZE 以及 RESIZE_OPTION 都是可选的

    • RESIZE_OPTION 默认设置为 Image::SHRINK_ONLY

例如,我们将根据上述完整配置设置 UploadManager。

$this->upload->filesToDir('dir/path')

上传一个大小为 (1680 x 1050) 的图像文件 foo.jpg 将生成 5 个文件:foo.jpg, 800_foo.jpg, 500_.jpg, 250_foo.jpg, thumb_foo.jpg,这些文件将保存在 %wwwDir%/uploads/super/dir 中。所有文件都将根据它们的 X 维度成比例调整大小,并使用相应的前缀保存。foo.jpg 被认为是原始文件,但调整到 1280px。

使用方法

ondrs\UploadManager\Upload 注入到您的 presenter 或您想要的地方

/** @var \ondrs\UploadManager\Upload @inject
public $upload;

然后执行上传。

public function renderUpload()
{
    $this->upload->filesToDir('path/to/dir');
}

如果您只想上传单个文件(例如,使用表单),请调用 singleFileToDir() 方法

public function processForm($form)
{
    /** @var Nette\Http\FileUpload */
    $fileUpload = $form->values->file;

    $this->upload->singleFileToDir('path/to/dir', $fileUpload);
}

事件

真正的乐趣来自于事件。它们在这里帮助您轻松地控制和监控您的上传过程。

  • onQueueBegin

    • 在上传开始之前调用
    • 接受一个参数
      1. 将上传的 Nette\Http\FileUpload 对象数组
  • onQueueComplete

    • 上传完成后调用
    • 接受两个参数
      1. Nette\Http\FileUpload 数组
      2. \SplFileInfo 对象数组,表示已上传
  • onFileBegin

    • 每个文件 上传之前调用
    • 接受两个参数
      1. Nette\Http\FileUpload
      2. 构造为 {relativePath}[/{dir}] 的目录
  • onFileComplete

    • 每个文件 上传完成后调用
    • 接受三个参数
      1. 原始文件 的 Nette\Http\FileUpload 对象
      2. 上传文件 的 \SplFileInfo 对象
      3. 构造为 {relativePath}[/{dir}] 的目录

真实世界示例

/**
 * @param int $eventId
 */
public function uploadAttachment($eventId)
{
    /**
     * @param FileUpload $fileUpload
     * @param \SplFileInfo $uploadedFile
     * @param $path
     */
    $this->upload->onFileComplete[] = function (\SplFileInfo $uploadedFile, FileUpload $fileUpload, $path) use ($eventId) {

        $filename = $uploadedFile->getFilename();

        $this->db->table('crm_attachments')
            ->insert([
                'filename' => $filename,
                'path' => $path,
                'crm_events_id' => $eventId,
            ]);
    };

    /**
     * @param array $files
     * @param array $uploadedFiles
     */
    $this->upload->onQueueComplete[] = function(array $files, array $uploadedFiles) use($eventId) {

        $uploadedFiles = array_map(function($i) {
            return $i->getFilename();
        }, $uploadedFiles);

        $this->db->table('crm_events')
            ->wherePrimary($eventId)
            ->update([
                'text' => implode(';', $uploadedFiles),
            ]);
    };

    $this->upload->filesToDir('attachments/' . $eventId);
}