vkr / symfony-web-uploader
简化文件上传到外部API的PHP库
Requires
- php: >=5.6
- symfony/http-foundation: ~2.8|~3.0
- vkr/settings-bundle: ~1.1
Requires (Dev)
- phpunit/phpunit: >=5.4
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);