Yii2 Kartik FileInput多文件上传时删除按钮失效问题求助
Kartik file-input多文件删除异常解决方案
1 核心配置错误修复
你当前代码的最主要问题是$initialPreviewConfigAward在循环中直接赋值,每次都会覆盖之前的配置,最终仅保留最后一个文件的删除配置,其他文件的删除按钮没有绑定对应请求地址,自然无法正常触发删除动作,同时循环代码中存在多余闭合中括号的语法错误。
修改后的表单代码如下:
<?php $allfiles = []; $initialPreviewConfigAward = []; if (!$model->isNewRecord) { $filesData = ArrayHelper::map(MakerFiles::find()->where(['maker_id' => $model->id,'type'=>$model->gs_type])->all(),'id','file_url'); foreach($filesData as $iKey=>$iVal) { $allfiles[] = '/backend/web/'.$iVal; // 改为数组追加逻辑,不要直接赋值覆盖 $initialPreviewConfigAward[] = [ 'caption' => '/backend/web/'.$iVal, 'url' => Url::to(['greensocial/delete-files','id' => $iKey]) ]; } } ?> <?= $form->field($upload, 'file_url[]')->widget(FileInput::classname(), ['options' => ['id'=>'award-file','multiple' => true], 'pluginOptions'=>[ 'previewFileType' => 'any', 'overwriteInitial'=>false, 'initialPreview'=>$allfiles, 'initialPreviewAsData'=> true, 'initialPreviewConfig' => $initialPreviewConfigAward, 'showCaption' => false, 'showRemove' => false, 'showUpload' => false, ], ])->label(false); ?>
2 控制器代码优化
你当前的控制器没有指定JSON响应格式,且调用save(false)无实际修改逻辑属于无效操作,修改后的代码如下:
public function actionDeleteFiles($id){ // 指定响应格式为JSON \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; $file = MakerFiles::find()->where(['id'=>$id])->one(); if (!$file) { return ['error' => '文件记录不存在']; } $filetodelete = \Yii::getAlias('@backend/web/').$file->file_url; if( file_exists ($filetodelete)) { unlink($filetodelete); // 直接删除数据库记录即可,无需调用空save if($file->delete()){ return ['success' => 'Fichier supprimé']; } return ['error' => '文件记录删除失败']; } return ['error' => 'Unable to delete']; }
3 异常排查项
如果修改后仍有问题,可优先检查两点:
- 确认
deleteFiles动作未被权限规则拦截,支持Ajax访问 - 检查页面控制台是否存在JS报错,确认页面内没有重复id为
award-file的元素冲突
内容的提问来源于stack exchange,提问作者DavidP
相关产品推荐
相关产品推荐

