最近在使用yii2開發(fā)一個表單頁面的時候苔悦,有多圖上傳的需求,稍微找了找這方面的組件顺少,基本都安利fileInput這個組件桅咆,于是就嘗試著使用這個庫來完成后端表單頁面的多圖上傳功能。使用的過程中發(fā)現(xiàn)還是有不少小細節(jié)需要注意的拥知,于是記錄一下使用的過程踏拜。
yii2-widget-fileinput這個庫的github地址在這里,安裝的部分就很常規(guī)了低剔,按文檔走就可以了速梗。
我們來看官方文檔展示的幾個常規(guī)操作:
use kartik\widgets\FileInput
// or 'use kartikile\FileInput' if you have only installed yii2-widget-fileinput in isolation
// 使用ActiveForm 和 model綁定的單張圖片示例
echo $form->field($model, 'avatar')->widget(FileInput::classname(), [
'options' => ['accept' => 'image/*'],
]);
// 多圖上傳示例
echo '<label class="control-label">Add Attachments</label>';
echo FileInput::widget([
'model' => $model,
'attribute' => 'attachment_1[]',
'options' => ['multiple' => true]
]);
// 不綁定model的使用方法
echo '<label class="control-label">Upload Document</label>';
echo FileInput::widget([
'name' => 'attachment_3',
]);
// 不可點擊的示例
echo '<label class="control-label">Select Attachment</label>';
echo FileInput::widget([
'name' => 'attachment_4',
'disabled' => true
]);
而這些都是常規(guī)操作肮塞,我們來設(shè)想一下,我們要完成淘寶的商品添加镀琉,有個商品表峦嗤,有著一對多關(guān)系的若干張圖片蕊唐,這時候就需要用到多圖上傳功能了屋摔。而且我們還希望上傳圖片是異步的,那么我們可以這么配置我們的fileInput組件
<?= $form->field($model, 'image[]')->label($label)->widget(FileInput::classname(), [
// 'name' => 'ImgSelect',
'language' => 'zh-CN',
'options' => ['multiple' => true, 'accept' => 'image/*'],
'pluginOptions' => [
'initialPreview' => $initialPreview,
'initialPreviewConfig' => $initialPreviewConfig,
'allowedPreviewTypes' => ['image'],
'allowedFileExtensions' => ['jpg', 'gif', 'png'],
'previewFileType' => 'image',
'overwriteInitial' => false,
'browseLabel' => '選擇圖片',
'msgFilesTooMany' => "選擇上傳的圖片數(shù)量({n}) 超過允許的最大圖片數(shù){m}替梨!",
'maxFileCount' => 5,//允許上傳最多的圖片5張
'maxFileSize' => 2048,//限制圖片最大200kB
'uploadUrl' => Url::to(['/upload/image']),
//'uploadExtraData' => ['testid' => 'listimg'],
'uploadAsync' => true,//配置異步上傳還是同步上傳
],
'pluginEvents' => [
'filepredelete' => "function(event, key) {
return (!confirm('確認要刪除'));
}",
'fileuploaded' => 'function(event, data, previewId, index) {
$(event.currentTarget.closest("form")).append(data.response.imgfile);
}',
'filedeleted' => 'function(event, key) {
$(event.currentTarget.closest("form")).find("#"+key).remove();
return;
}',
]
]); ?>
我們在控制器配置好圖片瀏覽的配置钓试,傳入進來。代碼里的關(guān)鍵點我已經(jīng)加上了配置副瀑,我們可以看到弓熏,這時異步上傳的url已經(jīng)配置到了upload/image
這個控制器里,而我們也在刪除糠睡,上傳等操作完成時加上了js的回調(diào)挽鞠。
如上所述,我們羅列了一些都是組件 FileInput的基本屬性和設(shè)置狈孔,如有所需信认,可查看文檔看屬性的詳細說明。
看下上傳圖片的控制器里均抽,我們是怎么寫actionImage
這個函數(shù)的
/**
* 上傳圖片到臨時目錄
* @return string
* @throws \yii\base\Exception
*/
public function actionImage()
{
if (Yii::$app->request->isPost) {
$res = [];
$initialPreview = [];
$initialPreviewConfig = [];
$images = UploadedFile::getInstancesByName("UploadImage[image]");
if (count($images) > 0) {
foreach ($images as $key => $image) {
if ($image->size > 2048 * 1024) {
$res = ['error' => '圖片最大不可超過2M'];
return json_encode($res);
}
if (!in_array(strtolower($image->extension), array('gif', 'jpg', 'jpeg', 'png'))) {
$res = ['error' => '請上傳標準圖片文件, 支持gif,jpg,png和jpeg.'];
return json_encode($res);
}
$dir = '/uploads/temp/';
//生成唯一uuid用來保存到服務器上圖片名稱
$pickey = ToolExtend::genuuid();
$filename = $pickey . '.' . $image->getExtension();
//如果文件夾不存在嫁赏,則新建文件夾
if (!file_exists(Yii::getAlias('@backend') . '/web' . $dir)) {
FileHelper::createDirectory(Yii::getAlias('@backend') . '/web' . $dir, 777);
}
$filepath = realpath(Yii::getAlias('@backend') . '/web' . $dir) . '/';
$file = $filepath . $filename;
if ($image->saveAs($file)) {
$imgpath = $dir . $filename;
/*Image::thumbnail($file, 100, 100)
->save($file . '_100x100.jpg', ['quality' => 80]);
*/
// array_push($initialPreview, "<img src='" . $imgpath . "' class='file-preview-image' alt='" . $filename . "' title='" . $filename . "'>");
$config = [
'caption' => $filename,
'width' => '120px',
'url' => '../upload/delete', // server delete action
'key' => $pickey,
'extra' => ['filename' => $filename]
];
array_push($initialPreviewConfig, $config);
$res = [
"initialPreview" => $initialPreview,
"initialPreviewConfig" => $initialPreviewConfig,
"imgfile" => "<input name='image[]' id='" . $pickey . "' type='hidden' value='" . $imgpath . "'/>",
'filename' => $filename,
'imagePath' => $imgpath,
];
}
}
}
return json_encode($res);
}
}
到此,多圖上傳的工作我們也就完美的實現(xiàn)了油挥。
為了實現(xiàn)圖片的刪除效果潦蝇,這里可以先上傳兩張圖片。你可以單張上傳也可以多張上傳深寥。
上傳成功后你可以刷新當前頁面攘乒,因為一開始我們就在controller中實現(xiàn)了圖片的預覽工作,所以理應會展示我們已經(jīng)上傳的兩張圖片惋鹅。
至于刪除函數(shù)就不講了持灰,只要在瀏覽里配置上刪除的url,也是一樣的操作咯负饲。