attachy/attachy

上传处理自动化

dev-master 2012-12-05 04:52 UTC

This package is not auto-updated.

Last update: 2024-09-24 05:51:06 UTC


README

长段落插件放置处。

特性

  • PHP 5.3 兼容
  • 类似 Carrierwave 的版本支持。
  • 简洁 - 仅需要在数据库表中对每个文件添加一个字段。
  • 依赖注入
  • 不是明确依赖于 Elequent,也不扩展 Eloquent 模型。
  • 支持批量赋值
  • 模块化 - 扩展以使用 S3 存储,处理 AJAX 上传。
  • 更灵活 - 允许您决定如何创建缩略图和设计数据库表。
  • 更安全 - 过滤危险的文件名和扩展名,如 '.php'。

与 Eloquent 一起使用

在您的表中插入一个新字符串列,用于存储 Attachy 的文件元数据。

<?php

Schema::create('posts', function($table)
{
  $table->increments('id');
  $table->string('title');
  $table->string('cool_pic');

转到您的应用程序目录,并创建一个名为 'attachy' 的新子目录。

cd /project/application
mkdir attachy
cd attachy/

在您刚刚创建的应用程序/attachy 目录内,创建一个名为 'coolpic.php' 的新 PHP 源文件。

<?php
class CoolPic extends Filer {}

现在来创建我们的帖子模型类。

<?php

class Post extends Eloquent {

  public function get_cool_pic()
  {
    // Tell Attachy to save the file identifer to the 
    //cool_pic column defined in the previously created  migration.
    return CoolPic::attach("cool_pic", $this);
  }

  // Overload the Elquent save method.
  public function save()
  {
    $this->cool_pick->save();
    parent::save();
  }
}

在 'attach' 方法中,第一个参数表示之前创建的迁移中属性的名称,Attachy 将存储用于稍后检索文件路径所需的信息。

我们的帖子表单很简单

{{ Form::open_for_files('post') }}
  {{ Form::file('cool_pic') }}
  {{ Form::submit('Post') }}
{{ Form::close() }}

根据约定,Attachy 将寻找您的 Filer 类类名的下划线版本,由批量赋值提供。在这个例子中,在帖子字段中是 'CoolPic'

然后,在我们的 route.php 中,我们可以使用批量赋值将帖子字段直接映射到我们的模型

<?php

Route::post('new_post', function()
{
  // populating and saving your model is not changed when using
  // Attachy.
  $post = new Post(Input::all());
  $post->save();
}

就这样,您无需担心检查 multipart 请求伪造或有害的文件扩展名(如 .php 或 .sh),这些都已经为您处理好了。

生成图像标签

{{ HTML::image($post->cool_pic) }}

在这个示例表单中,表单输入字段的名称是

为了生成我们图像的缩略图版本,我们可以创建一个新版本已调整大小的文件。回到我们在 application/attachy/coolpic.php 中之前定义的 CoolPic 类,并更改以下代码。

class CoolPic extends Filer {

  static function has_versions()
  {
    static::register("thumbnail", function($version)
    {
      $version->transform(function($storage)
      {
        $path = $storage->retrieve();
        // do not change the file name or location set by Attachy
        $handle = fopen($path, 'r+');
        $thumb = new Imagick();
        $thumb->readImageFile($handle);
        $thumb->thumbnailImage("250", "250");
        $thumb->writeImage($handle);
      });
    });
  }
}

'register' 方法的第一个参数是检索其文件路径时将引用的名称。第二个参数是一个 lambda,它将用于配置版本。有很多配置选项,但我们现在只覆盖 transform 方法。使用 transform 方法对新建的版本进行操作,我们可以注册另一个 lambda,该 lambda 将用于操作图像文件。

生成指向文件缩略图版本的链接

{{ HTML::image($post->cool_pic('thumbnail')) }}

使用这种设计,Attachy 允许您对文件执行任何操作,而无需强制您使用限制性 API。这使您有权自行决定是否使用 Image Magick、Gmagick、GD。您甚至可以进行与图像无关的处理,例如创建包含文件内容的 zip 文件以发布,可能性仅限于可以写入文件的所有内容。