vkr/symfony-web-uploader

简化文件上传到外部API的PHP库

1.2.1 2017-03-23 23:36 UTC

This package is auto-updated.

Last update: 2024-09-20 22:58:32 UTC


README

这个小型库(不是bundle!)简化了通过API将文件上传到外部资源的过程。自1.2版本起,此库依赖于Symfony。

此库本身不执行任何操作,它旨在由其他bundle或库扩展。

安装

实际上这里没有要安装的内容。

使用方法

在Symfony项目中

首先,您需要创建一个AbstractUploader类的具体服务实现。此服务需要一个名为upload()的方法,不接受任何参数,并且按照惯例应该返回$this

以下是从该方法内部可访问的属性

  • $this->file - 作为原始文件处理器的Symfony\Component\HttpFoundation\File\File对象
  • $this->uploadURL - 远程目标文件夹的完整路径,不包含尾部斜杠
  • $this->filename - 将赋予新上传文件的名称 - 请参阅名称更改器

如果您在Symfony服务容器中注册此服务,则需要安装VKRSettingsBundle并将其添加到services.yml中作为参数

my_uploader:
    class: AppBundle\MyUploader
    arguments:
        - "@vkr_settings.settings_retriever"

然后,您需要创建三个设置,无论是作为参数还是存储在您的数据库中

  • allowed_upload_types - MIME类型数组
  • allowed_upload_size - 可以上传的最大字节大小
  • 一个带有远程目标文件夹完整URL的设置,无论是否有尾部斜杠

请参阅VKRSettingsBundle手册了解如何定义设置。

以下是如何从您的控制器访问此服务

$uploader->setUploadDir('my_upload_dir_setting_name');
$file = new Symfony\Component\HttpFoundation\File\File('path/to/file/filename');
$uploader->setFile($file);
$uploader->upload()->checkIfSuccessful();

这里checkIfSuccessful()检查上传的文件是否存在,具有与原始文件相同的尺寸和MIME类型,并在出错时抛出异常。

如果您想禁用对大小和MIME类型的检查,可以调用

$uploader->setFile($file, null, false);

名称更改器

setFile()的第二个参数是一个名称更改器对象。它定义了新文件将具有什么名称。如果没有名称更改器,新文件将具有与原始文件相同的名称。名称更改器必须实现NameChangerInterface

假设您希望所有文件都使用当前Unix时间戳重命名,在这种情况下,您的名称更改器将如下所示

class MyNameChanger implements VKR\SymfonyWebUploader\Interfaces\NameChangerInterface
    public function changeName($originalFilename)
    {
        return time();
    }

    public function setParameters(array $parameters)
    {
    }

然后在您的控制器中

$nameChanger = new MyNameChanger();
$uploader->setFile($file, $nameChanger);

如果您只是上传了一个客户端上传的文件,并希望保留客户端的文件名,则不需要创建名称更改器。在这种情况下,默认的新名称将与客户端文件名相对应,而不是PHP临时名称。

在Symfony之外

在Symfony之外,事情并没有那么不同,但是您不能使用VKRSettingsBundle,必须将设置作为数组传递

$settings = [
    'allowed_upload_size' => 10000,
    'allowed_upload_types' => ['image/jpeg, 'image/png'],
    'upload_dir' => 'http://my-upload-domain.com/upload-folder/',
];
$uploader = new VKR\SymfonyWebUploader\Uploader(null, $settings);

此外,如果您正在转发从表单上传的文件,您需要手动初始化它

$file = new Symfony\Component\HttpFoundation\File\UploadedFile($_FILES['file']['tmp_name'], $_FILES['file']['name']);
$uploader->setFile($file);