Yii2.0 webuploader圖片上傳

圖片上傳幾乎是應用必備,前面也針對 kartik 的 fileinput 作了一篇詳細的說明,不過不少人反饋各類問題,下面針對 webuploader的使用單獨寫了一個組件。該組件能夠更好的處理 Yii2 在圖片上傳過程當中帶來的一系列問題,目前支持多圖多字段多modal的混合上傳。php

介紹以前咱們先演示下效果。html

5e00434d73-image3.gif

安裝

推薦使用composer進行安裝web

$  composer require bailangzhan/yii2-webuploader dev-master 

使用

params.php或者params-local.php內增長webuploader和domain配置項數據庫

// 圖片服務器的域名設置,拼接保存在數據庫中的相對地址,可經過web進行展現
'domain' => 'http://ceshi_admin.com/',
'webuploader' => [
    // 後端處理圖片的地址,value 是相對的地址
    'uploadUrl' => 'blog/upload',
    // 多文件分隔符
    'delimiter' => ',',
    // 基本配置
    'baseConfig' => [
        'defaultImage' => 'http://ceshi_admin.com/it/u=2056478505,162569476&fm=26&gp=0.jpg',
        'disableGlobalDnd' => true,
        'accept' => [
            'title' => 'Images',
            'extensions' => 'gif,jpg,jpeg,bmp,png',
            'mimeTypes' => 'image/*',
        ],
        'pick' => [
            'multiple' => false,
        ],
    ],
],

 

webuploader['baseConfig'] 參考 webuploader官方的參數說明後端

視圖文件ruby

單圖服務器

<?php 
    echo $form->field($model, 'file')->widget('manks\FileInput', [
    ]); 
?>

 

多圖yii2

<?php 
echo $form->field($model, 'file2')->widget('manks\FileInput', [
    'clientOptions' => [
        'pick' => [
            'multiple' => true,
        ],
        // 'server' => Url::to('upload/u2'),
        // 'accept' => [
        //     'extensions' => 'png',
        // ],
    ],
]); ?>

 

控制器 controller的地址能夠在params.php或者params-local.php中配置 Yii::$app->params['webuploader']['uploadUrl'], 也能夠在 clientOptions中配置 server 項。控制器須要返回的數據格式以下app

// 錯誤時
{"code": 1, "msg": "error"}
// 正確時, 其中 attachment 指的是保存在數據庫中的路徑,url 是該圖片在web可訪問的地址
{"code": 0, "url": "http://ceshi_admin/圖片地址", "attachment": "圖片地址"}

 

clientOptions一樣參考 webuploader官方的參數說明composer

注意

  1. 若是是修改的多圖片操做,務必保證 $model->file = 'src1,src2,src3,...'; 或者 $model->file = ['src1', 'src2'. 'src3', ...];

-------------------------------------------------------------------------------------------------------

下面介紹下yii2後端的處理方案

首先假設webuploader是按照前面所配置的,控制器就是 blog/upload,先看下 BlogController的實現

use common\components\Upload;
use yii\helpers\Json;


public function actionUpload()
{
    try {
        $model = new Upload();
        $info = $model->upImage();


        $info && is_array($info) ?
        exit(Json::htmlEncode($info)) :
        exit(Json::htmlEncode([
            'code' => 1, 
            'msg' => 'error'
        ]));


    } catch (\Exception $e) {
        exit(Json::htmlEncode([
            'code' => 1, 
            'msg' => $e->getMessage()
        ]));
    }
}

 

固然,你的common/components目錄下尚未Upload.php,其代碼參考以下

<?php
namespace common\components;
use Yii;
use yii\base\Model;
use yii\web\UploadedFile;
use yii\base\Exception;
use yii\helpers\FileHelper;

/**
 * 文件上傳處理
 */
class Upload extends Model
{   
    public $file;
    private $_appendRules;
    public function init () 
    {
        parent::init();
        $extensions = Yii::$app->params['webuploader']['baseConfig']['accept']['extensions'];
        $this->_appendRules = [
            [['file'], 'file', 'extensions' => $extensions],
        ];
    }

    public function rules()
    {
        $baseRules = [];
        return array_merge($baseRules, $this->_appendRules);
    }

    /**
     * 
     */
    public function upImage ()
    {
        $model = new static;
        $model->file = UploadedFile::getInstanceByName('file');
        if (!$model->file) {
            return false;
        }
        $relativePath = $successPath = '';
        if ($model->validate()) {
            $relativePath = Yii::$app->params['imageUploadRelativePath'];
            $successPath = Yii::$app->params['imageUploadSuccessPath'];
            $fileName = $model->file->baseName . '.' . $model->file->extension;
            if (!is_dir($relativePath)) {
                FileHelper::createDirectory($relativePath);    
            }
            $model->file->saveAs($relativePath . $fileName);
            return [
                'code' => 0,
                'url' => Yii::$app->params['domain'] . $successPath . $fileName,
                'attachment' => $successPath . $fileName
            ];
        } else {
            $errors = $model->errors;
            return [
                'code' => 1,
                'msg' => current($errors)[0]
            ];
        }
    }
}

注意,你須要額外在params.php或者params-local.php文件內增長 imageUploadRelativePath 和 imageUploadSuccessPath配置項,前者指定相對的圖片路徑,後者用於保存的圖片前綴,參考以下

'imageUploadRelativePath' => './uploads/', // 圖片默認上傳的目錄 'imageUploadSuccessPath' => 'uploads/', // 圖片上傳成功後,路徑前綴 

對於原form對應的AR模型來看,咱們假設file和file2字段分別是單圖和多圖字段,那麼在數據庫保存的時候,$model->file="src"; $model->file2="src1,src2,src3,...";

AR模型對應的rules咱們能夠這樣寫

 
public function rules()
{
    return [
        [['file', 'file2'], 'required'],
        [['file', 'file2'], 'safe'],
        [['file'], 'string', 'max' => 255],
    ];
}
 

即保證file和file2必填且file限制255個字符。

此外,數據入庫以前,你還須要對file2進行拆分處理

is_array($this->file2) && $this->file2 && $this->file2 = implode(',', $this->file2);

轉載地址:http://www.manks.top/document/yii2-webuploader.html

相關文章
相關標籤/搜索