craigh/laravel-file-uploader

Laravel 的 Web 表单文件上传器

v1.1.1 2017-03-29 12:53 UTC

This package is not auto-updated.

Last update: 2024-09-20 22:03:31 UTC


README

Laravel File Uploader 是一个用于 Laravel 的 Web 表单上传管理器。此包为 craigh411/FileUploader 包提供额外的文件,以便在 Laravel 框架中使用。FileUploader 使用与 Laravel 文件上传相同的 symfony/HttpFoundation 包,因此易于集成,但添加了一些额外的功能,使文件上传变得简单。

特性

  • 允许和阻止特定的 MIME 类型。
  • 调整最大文件大小。
  • 选择自动创建上传目录。
  • 允许文件覆盖。
  • 自动创建净化后的文件名。
  • 创建唯一的文件名。

安装

要安装,只需在 composer.json 文件中包含 craigh/laravel-file-uploader 并运行 composer update。

您还应该通过在 config/app.php 的 providers 中添加以下内容来注册服务提供者

Humps\LaravelFileUploader\FileUploaderServiceProvider::class

创建别名(可选)

虽然不是必需的,但如果您想使用外观,则需要将以下内容添加到 config/app.php 的 aliases 中

'Upload' => Humps\LaravelFileUploader\Facades\UploaderFacade::class

然后您可以使用 Upload 别名来使用外观。

基本用法

由于 LaravelFileUploader 使用 symfony/HttpFoundation,您可以直接将 $request->file('input_name') 传递给文件方法。

如果您已添加外观的别名,则可以使用

Upload::file($request->file('file'))->move();

如果您在命名空间类中工作,则需要使用 use Upload 以使其正常工作。

如果您不使用外观,您可以在类的类方法或构造函数中类型提示 LaravelFileUploader,或者如果您愿意,您可以直接调用

$upload = App::make('upload');

直接更改设置

如果您想更改默认设置,则可以像这样链接它们(请参阅下面的方法以获取完整的设置列表)

Upload::file($request->all())
->createDirs(true)
->maxFileSize(5,'MB')
->allowedMimeTypes(['image/jpeg', 'image/png', 'image/gif'])
->move();

注意: move() 方法返回上传路径,因此必须链接到末尾。

使用继承进行配置

为了干净的配置,您可以扩展 LaravelFileUploader 类,这样您就可以访问以下受保护的变量

protected $uploadDir; // Upload directory
protected $allowedMimeTypes = []; // Only allow these file to be uploaded
protected $blockedMimeTypes = []; // Don't allow these files to be uploaded
protected $maxFileSize = 1000000; // In bytes
protected $makeFilenameUnique = false; // Make the filename unique if two files have the same name
protected $overwrite = false; // Allow overwriting of files with the same name
protected $createDirs = false; // Allow the automatic creation of any upload directories

例如,对于 ImageUploader,您可以这样做

use Humps\LaravelFileUploader\LaravelFileUploader;

class ImageUploader extends LaravelFileUploader{
    
   protected $uploadDir = 'images/';
   protected $maxFileSize = 5+6e; // 5 MB
   protected $createDirs = true;
   protected $makeFilenameUnique = true;
   
   protected $allowedMimeTypes = [
    'image/jpeg',
    'image/png',
    'image/gif'
   ];
  
}

现在可以在您的类中使用它,它将自动使用这些值作为默认值

/**
 * Example using dependency injection
 **/
private $upload;

function __construct(ImageUploader $upload){
    $this->upload = $upload;
}

public function store(Request $request){
    $this->upload->file($request->file('file'))->move();
}

处理异常

LaravelFileUploader 随附异常处理器,将用户重定向回出现错误的页面。要使用异常处理器,请将以下内容添加到 app\Exceptions\Handler.php 文件 render() 方法中

$uploadExceptionHandler = app()->make('uploadExceptionHandler', [$e]);
if ($errors = $uploadExceptionHandler->getUploadErrors()) {
  return $errors;
}

您可以在视图中从 $errors 变量中检索错误消息:(请参阅:https://laravel.net.cn/docs/5.1/validation#quick-displaying-the-validation-errors

自定义错误消息

如果您想在抛出异常时创建自己的自定义错误消息,您需要执行

php artisan vendor:publish

这将发布异常文件到 app\resources\lang\vendor\laravel-file-uploader\en,其中包含为每个异常显示的错误消息。

注意: 目前没有本地化错误消息,因此如果您不想使用英语,则需要自己创建这些消息。

自定义异常行为

如果您想使用LaravelFileUploaderExceptionHandler但又不喜欢默认的重定向用户行为,那么您应该通过扩展类来重写异常处理器的response()方法。当然,您需要更改boot()方法中的代码以引用您的子类。

use Humps\LaravelFileUploader\LaravelFileUploaderExceptionHandler as BaseHandler;

class CustomUploadExceptionHandler extends BaseHandler {
  protected function response(){
    die($this->error);
  }
}

Humps\FileUploader\Uploader 接口

您还可以绑定到 Humps\FileUploader\Uploader 接口。为此,请将以下代码放入 AppServiceProvider 的 register() 方法中

App::bind('Humps\FileUploader\Contracts\Uploader','Humps\LaravelFileUploader\LaravelFileUploader');;

然后您可以使用接口类型提示而不是具体的类

use Humps\FileUploader\Uploader;

private $upload;

function __construct(Uploader $upload){
    $this->upload = $upload;
}

现在,您可以通过更改绑定的类来简单地替换您自己的实现,例如:

App::bind('Humps\FileUploader\Contracts\Uploader','Your\Namespace\YourFileUploader');;

方法

uploadDir(string)

设置上传目录。如果没有设置,它将追加任何所需的 '/',因此 'path/to/dir' 和 'path/to/dir/' 都将有效。

$upload->uploadDir('path/to/dir');

注意: 公共文件夹将是上传的基础目录,因此如果您将上传路径设置为 'images' ($upload->uploadDir('images');),则这将上传到 public/images 文件夹。

overwrite(boolean)

设置为 true 以允许覆盖同名文件(默认:false)

$upload->overwrite(true);

allowedMimeTypes(array)

传入一个允许的 MIME 类型数组,其他所有内容都将被阻止。如果为空,则允许所有文件类型,除非明确阻止。

$upload->allowedMimeTypes(['image/jpeg, 'image/png', 'image/gif']);

blockedMimeTypes(array)

您也可以选择阻止文件类型。传入一个您想要阻止的 MIME 类型数组

$upload->blockedMimeTypes(['application/x-msdownload']);

maxFileSize($size, $unit)

您想要允许的最大文件大小,大小应为数字,单位可以是

  • B - 字节
  • KB - 千字节
  • MB - 兆字节

$upload->maxFileSize(5, 'MB');

您也可以使用单词 BYTE、BYTES、KILOBYTE、KILOBYTES、MEGABYTE 或 MEGABYTES

$upload->maxFileSize(1, 'MEGABYTE');

createDirs(bool)

如果设置为 true,这将递归创建任何指定的目录(默认:false)

$upload->createDirs(true);

makeFilenameUnique(bool)

如果设置为 true,这将通过在末尾追加 _{number} 来使文件名唯一。

$upload->makeFilenameUnique(true);

filename(string)

默认情况下,文件名将是上传文件名的净化版本。如果您想设置自己的文件名,请使用此方法。

$upload->filename('myFile.txt');

注意: 使用此方法时,文件名将不会净化,如果您想净化文件名,可以使用 sanitizeFilename() 方法。

sanitizeFilename()

通过删除任何非字母数字字符并用下划线替换任何空格来净化给定的文件名。您只有在想要使用 filename() 方法设置自己的文件名时才需要调用此方法,否则此方法将自动调用。您还应该意识到,此调用必须在设置文件名之后进行

$upload->filename('my%$crazy@filename.txt')->sanitizeFilename();
move()

将文件移动到其目的地并返回上传路径。

$uploadPath = $upload->move();

您还可以使用 upload(),它是 move() 的别名,如果您觉得措辞更合适

$uploadPath = $upload->upload();

这就完成了!