当前位置: 首页 > 知识库问答 >
问题:

yii2 kartik文件输入多个加载的文件预览

丌官嘉勋
2023-03-14

我试图使用kartikfileinput在表单中加载多个文件。

我使用我的附件表将文件名和其他字段保存在数据库中,并将文件保存在我的文件系统中。我通常把附件注册表通过注册表表链接起来。

我成功地保存了多个文件,但当我加载特定注册表的文件时,我希望看到它们,就像第一次加载它们时一样。

我正试图使用以下代码来解决此问题:

控制器动作

public function actionLoadMultiple($registryId = NULL){

    $model = new Attachment();

    if(!$registryId){
        $model->files = [];
        $registryId = 6;//For example
        $registry = \app\models\Registry::findOne($registryId);
        $registryAttachments = $registry->attachments;//Find all Attachment record for registryId
        foreach($registryAttachments as $attachment){
            $model->files[$attachment->original_filename] = $attachment->filePath();
        }
    }

    if (Yii::$app->request->isPost) {
        //Loading the files in the model.
        //After I load them, I save them using the model function uploadMultiple
        $model->files = UploadedFile::getInstances($model, 'files');
        $loadedFiles = $model->uploadMultiple();
        if ($loadedFiles) {
            // file is uploaded successfully
            foreach($loadedFiles as $originalFileName=>$fileName){
                $attachment = new Attachment();
                $attachment->section = $model->section?: 'oth';
                $attachment->description = $model->description ?: 'Other';
                $attachment->filename = $fileName;
                $attachment->original_filename =$originalFileName;
                if(!$attachment->save()){
                    $attachment->removeFile();
                    return ['error'=>\Yii::t('app','Error saving attachments to db. Please contact an administrator')];
                }
            }
            return $this->redirect(['index']);
        }
    }

    return $this->render('load_multiple',['model'=>$model]);
}

模型函数

public function uploadMultiple(){
    $files = $this->files;
    $section = $this->section ?: '';
    if(!$files){
        return false;
    }

    $fileNameList = [];
    $path = Utility::getAttachmentsBasePath();
    $count = 1;
    foreach ($files as $file) {
        if (!$section) {
            $section = 'oth';
        }

        $filename = \app\models\Attachment::generateFilename($file->name);

        //I set the path to the right folder
        $completePath = $path . '/' . $section . '/' . $filename;
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            $completePath = str_replace('/', '\\', ($completePath));
        }

        if (!$file->saveAs($completePath)) {
            Yii::error("Error loading file - error code {$file->error}", "upload");
            return ['error' => \Yii::t('app', 'Error saving files. Please contact an administrator')];
        }

        if (isset($fileNameList[$file->name])) {
            $fileNameList[$file->name . '_' . $count] = $filename ;
            $count++;
        } else {
            $fileNameList[$file->name] = $filename;
        }
    }
    return $fileNameList;
}

查看加载倍数

<?php

  use yii\widgets\ActiveForm;
  use kartik\file\FileInput;
  use yii\helpers\Html;


   $this->title = Yii::t('app', 'Create Multiple Attachment');
   $initialPreviewAttachmentFile = [];
   $fileInputShowRemove = true;


   if($model->files){
    foreach($model->files as $key=>$file){
     $basePath = Yii::$app->params['attachmentsBasePath'].'/reg';
     $type = \app\models\Attachment::fileInputTypeForUploaded($key);
     $initialPreviewAttachmentFile[] = $file;
     $initialPreviewAttachmentCaption[] = ['caption'=>$key,'type'=>$type,];
   }
  }


  $form = ActiveForm::begin(['enableAjaxValidation' => true,]);




  echo $form->field($model, 'files[]')->widget(FileInput::class, 
    [
        'name' => 'files[]',
        'options' => ['multiple' => true],
        'pluginOptions' => [
     //                'minFileCount' => 1,
            'maxFileCount' => 10,
            'maxFileSize' => Yii::$app->params["attachmentsMaxSize"],
            'initialPreview' => $initialPreviewAttachmentFile ,
            'initialPreviewAsData' => (!empty($initialPreviewAttachmentFile)),
            'initialPreviewConfig' => $initialPreviewAttachmentCaption,
            'fileActionSettings' => [
                'showDownload' => false,
                'showRemove' => true,
            ],
        ],
    ]);
 ?>
<div class="form-group">
<?=
    Html::submitButton(Yii::t('app', 'Save'), [
        'class' => 'btn btn-success save-attachment',
    ])
?>

如果选定的注册表附带了3个文件,则结果如下:

在此设置中,我有以下问题:

  1. 我想查看每个文件的内容,但它不起作用
  2. 当我加载一个新文件时,小部件会删除已经加载的文件
  3. “单个文件删除”按钮不起作用

共有1个答案

萧业
2023-03-14

当我加载一个新文件时,小部件会删除已经加载的文件。仅适用于ajax加载

 类似资料:
  • 所以我正在和Yii2一起工作,对它来说是相当新的。我正在使用Kartik文件上传,并试图将代码转换为多个文件。但它只保存了第一个文件。 我已经删除了验证,因为这也是失败的,但一旦我知道所有其他的都在工作,我会重新添加。 型号: 控制器: 查看:

  • 问题内容: 我需要处理分散在各个目录中的多个文件。我想将所有这些加载到单个RDD中,然后在其上执行map / reduce。我看到SparkContext能够使用通配符从单个目录加载多个文件。我不确定如何从多个文件夹加载文件。 以下代码段失败: 这在第三个循环中失败,并显示以下错误消息: 鉴于我仅提供了两个参数,所以这很奇怪。任何指针表示赞赏。 问题答案: 措辞如何呢? 在Scala中,有两种变体

  • 用PySimpleGUI一次可以选择多个文件路径吗 只能选择一个文件 null 没有循环模式的多个文件的任何API?

  • 在单个 Step 中处理多个输入文件是很常见的需求。如果这些文件都有相同的格式, 则可以使用 MultiResourceItemReader 来进行处理(支持 XML/或 纯文本文件)。 假如某个目录下有如下3个文件: file-1.txt file-2.txt ignored.txt file-1.txt 和 file-2.txt 具有相同的格式, 根据业务需求需要一起处理. 可以通过 Muli

  • 我想上传多输入文件。我尝试了下面的代码,但文件没有上传,我无法获得上传目录。 HTML 控制器 我也尝试用下面的代码获取上传的数据,但为什么总是出现错误?

  • It is also possible to lazy load entry points. This means that you load parts of your application as they are requested. A typical scenario for this would be that your users only visits specific parts