溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Yii2中如何使用FileInput多圖上傳插件

發(fā)布時(shí)間:2021-08-12 14:19:03 來(lái)源:億速云 閱讀:145 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

Yii2中如何使用FileInput多圖上傳插件,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。

首先還是先安裝組件

composer require kartik-v/yii2-widget-fileinput "@dev"

先做一個(gè)必要的說(shuō)明:假設(shè)我們有一張商品表,一張商品圖片表,商品圖片表只對(duì)商品id和圖片地址進(jìn)行存儲(chǔ)

看基本使用

use kartik\file\FileInput;
// 非ActiveForm的表單
echo '<label class="control-label">圖片</label>';
echo FileInput::widget([
'model' => $model,
'attribute' => 'image[]',
'options' => ['multiple' => true]
]);
//使用ActiveForm的表單
echo $form->field($model, 'image[]')->widget(FileInput::classname(), [
'options' => ['multiple' => true],
]);

上面上傳多圖,只需要設(shè)置multiple=true即可,記得選擇圖片的時(shí)候多選。

如此一來(lái),圖片選擇好了直接提交表單就好,文件上傳的程序需要自行處理,如果你還沒(méi)有實(shí)現(xiàn),可以參考文件上傳的基本操作。

多圖上傳的唯一麻煩就是,修改的時(shí)候怎么才方便?不著急,F(xiàn)ileInput都幫我們解決了!

我們看編輯的時(shí)候圖片的展示以及如何異步的刪除單個(gè)或者多個(gè)圖片!

// 視圖文件
use kartik\file\FileInput;
<?php $form = ActiveForm::begin([
'options' => ['enctype'=>'multipart/form-data'],
]); ?>
<?php 
echo $form->field($model, 'banner_url[]')->label('banner圖')->widget(FileInput::classname(), [
'options' => ['multiple' => true],
'pluginOptions' => [
// 需要預(yù)覽的文件格式
'previewFileType' => 'image',
// 預(yù)覽的文件
'initialPreview' => ['圖片1', '圖片2', '圖片3'],
// 需要展示的圖片設(shè)置,比如圖片的寬度等
'initialPreviewConfig' => ['width' => '120px'],
// 是否展示預(yù)覽圖
'initialPreviewAsData' => true,
// 異步上傳的接口地址設(shè)置
'uploadUrl' => Url::toRoute(['/goods/async-image']),
// 異步上傳需要攜帶的其他參數(shù),比如商品id等
'uploadExtraData' => [
'goods_id' => $id,
],
'uploadAsync' => true,
// 最少上傳的文件個(gè)數(shù)限制
'minFileCount' => 1,
// 最多上傳的文件個(gè)數(shù)限制
'maxFileCount' => 10,
// 是否顯示移除按鈕,指input上面的移除按鈕,非具體圖片上的移除按鈕
'showRemove' => true,
// 是否顯示上傳按鈕,指input上面的上傳按鈕,非具體圖片上的上傳按鈕
'showUpload' => true,
//是否顯示[選擇]按鈕,指input上面的[選擇]按鈕,非具體圖片上的上傳按鈕
'showBrowse' => true,
// 展示圖片區(qū)域是否可點(diǎn)擊選擇多文件
'browseOnZoneClick' => true,
// 如果要設(shè)置具體圖片上的移除、上傳和展示按鈕,需要設(shè)置該選項(xiàng)
'fileActionSettings' => [
// 設(shè)置具體圖片的查看屬性為false,默認(rèn)為true
'showZoom' => false,
// 設(shè)置具體圖片的上傳屬性為true,默認(rèn)為true
'showUpload' => true,
// 設(shè)置具體圖片的移除屬性為true,默認(rèn)為true
'showRemove' => true,
],
],
// 一些事件行為
'pluginEvents' => [
// 上傳成功后的回調(diào)方法,需要的可查看data后再做具體操作,一般不需要設(shè)置
"fileuploaded" => "function (event, data, id, index) {
console.log(data);
}",
],
]);
?>
<?php ActiveForm::end(); ?>

如上所述,基本上都是組件 FileInput的基本屬性和設(shè)置,我們這里也僅僅羅列了一些常用的屬性介紹,如有所需,可查看文檔看屬性的詳細(xì)說(shuō)明。

按照如上所配置,我們預(yù)覽下效果圖

Yii2中如何使用FileInput多圖上傳插件

Yii2中如何使用FileInput多圖上傳插件

感覺(jué)上效果很是可以,在開(kāi)始寫(xiě)php代碼實(shí)現(xiàn)之前,我們先在controller中實(shí)現(xiàn) initialPreview和 initialPreviewConfig的配置

假設(shè)上面的視圖文件是用戶展示商品圖片的詳情頁(yè),當(dāng)前controller是指渲染視圖文件的controller,則需要在controller中獲取商品關(guān)聯(lián)的圖片,用于展示或者說(shuō)用于商品圖片的刪除\新增操作。

// 假設(shè)商品的圖片是 $relationBanners,$id是商品的id
// $relationBanners的數(shù)據(jù)結(jié)構(gòu)如:
/**
* Array
*(
* [0] => Array
* (
* [id] => 1484314
* [goods_id] => 1173376
* [banner_url] => ./uploads/20160617/146612713857635322241f2.png
* )
*
*)
*/
$relationBanners = Banner::find()->where(['goods_id' => $id])->asArray()->all();
// 對(duì)商品banner圖進(jìn)行處理
$p1 = $p2 = [];
if ($relationBanners) {
foreach ($relationBanners as $k => $v) {
$p1[$k] = $v['banner_url'];
$p2[$k] = [
'url' => Url::toRoute('/banner/delete'),
'key' => $v['id'],
];
}
}
$model = new Banner;
return $this->render('banner', [
'model' => $model,
'p1' => $p1,
'p2' => $p2,
'id' => $id
]);

你可以看到p1是圖片地址的集合,這里用于賦值給initialPreview

p2是一組url和key的集合,這里用于賦值給initialPreviewConfig

其中url是移除圖片的請(qǐng)求地址

key是每個(gè)圖片對(duì)應(yīng)的id

此時(shí)我們視圖文件中的pluginOptions應(yīng)該是這樣的

'pluginOptions' => [
// other code
'initialPreview' => $p1,
'initialPreviewConfig' => $p2,
// other code
],

注意設(shè)置initialPreviewAsData為true哦,不然等會(huì)創(chuàng)建圖片后,預(yù)覽圖不會(huì)顯示。

我們?cè)谝婚_(kāi)始配置文件中配置了uploadUrl,該參數(shù)是異步上傳的圖片地址。

現(xiàn)在看上傳界面應(yīng)該是光禿禿的,我們選擇一張圖片后效果如上圖2所示,

需要提醒的是,每張小圖片上的上傳是上傳對(duì)應(yīng)的小圖片,input框(右下角)的上傳和移除都是針對(duì)所有的圖片的操作,一張也是上傳,十張也是上傳,我們這里只對(duì)多圖上傳的操作做一個(gè)必要的說(shuō)明。

圖片上傳的地址以及上傳需要的額外參數(shù)(如商品id)我們都準(zhǔn)備好了,額外的參數(shù)配置項(xiàng)是uploadExtraData,具體見(jiàn)上面視圖文件中的配置。

接著我們看 /goods/async-image 異步上傳的程序?qū)崿F(xiàn)

public function actionAsyncImage ()
{
// 商品ID
$id = Yii::$app->request->post('goods_id');
$p1 = $p2 = [];
if (empty($_FILES['Banner']['name']) || empty($_FILES['Banner']['name']['banner_url']) || !$id) {
echo '{}';
return;
}
for ($i = 0; $i < count($_FILES['Banner']['name']['banner_url']); $i++) {
$url = '/banner/delete';
$imageUrl = ''; //調(diào)用圖片接口上傳后返回圖片地址
// 圖片入庫(kù)操作,此處不可以批量直接入庫(kù),因?yàn)楹竺嫖覀冞€要把key返回 便于圖片的刪除
$model = new Banner;
$model->goods_id = $id;
$model->banner_url = $imageUrl;
$key = 0;
if ($model->save(false)) {
$key = $model->id;
}
// $pathinfo = pathinfo($imageUrl);
// $caption = $pathinfo['basename'];
// $size = $_FILES['Banner']['size']['banner_url'][$i];
$p1[$i] = $imageUrl;
$p2[$i] = ['url' => $url, 'key' => $key];
}
echo json_encode([
'initialPreview' => $p1, 
'initialPreviewConfig' => $p2, 
'append' => true,
]);
return;
}

到此,單圖和多圖上傳的工作我們也就完成了。

為了實(shí)現(xiàn)圖片的刪除效果,這里可以先上傳兩張圖片。你可以單張上傳也可以多張上傳。

上傳成功后你可以刷新當(dāng)前頁(yè)面,因?yàn)橐婚_(kāi)始我們就在controller中實(shí)現(xiàn)了圖片的預(yù)覽工作,所以理應(yīng)會(huì)展示我們已經(jīng)上傳的兩張圖片。

按照我們的配置,現(xiàn)在的預(yù)覽圖應(yīng)該是這樣的。

Yii2中如何使用FileInput多圖上傳插件

不說(shuō)廢話,我們看圖片刪除的程序(/banner/delete)實(shí)現(xiàn)

public function actionDelete ()
{
if ($id = Yii::$app->request->post('key')) {
$model = $this->findModel($id);
$model->delete();
}
Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
return ['success' => true];
}

需要提醒的是,key就是我們配置 initialPreviewConfig項(xiàng)時(shí)指定的key,你可以參考controller中的key,也可以參考異步上傳成功后p2的key.

到此,yii2中多圖上傳的組件使用以及程序代碼我們都給出了具體的實(shí)現(xiàn)。

看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI