【问题标题】:How to create a directory inside a directory in yii2 and upload file into that directory如何在 yii2 的目录中创建目录并将文件上传到该目录
【发布时间】:2016-08-04 04:16:04
【问题描述】:

我有一个表格

  <?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>
 <?php echo $form->field($userformmodel, 'user_image')->fileInput(); ?>
 <?= Html::submitButton('Submit', ['class' => 'btn btn-primary']) ?>
 <?php ActiveForm::end(); ?>

我正在上传表单中的文件并提交

In the model I have written the code as

 public function rules()
{
    return [
        [['user_image'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg']
    ];
}

 public function upload()
{
    if ($this->validate()) {
        $this->user_image->saveAs('uploads/' . $this->user_image->baseName . '.' . $this->user_image->extension);
        return true;
    } else {
        return false;
    }
}

在我的控制器中

 public function actionProfile()
{
 $model = new UserProfile();
 $userformmodel = new UserForm();
 $model->user_image = UploadedFile::getInstance($userformmodel, 'user_image');
 if($model->save(false))
                {
                $model->upload();        
                }
 }

这只是创建一个名为uploads 的目录。但我想在上传目录中为每个用户创建一个目录,即基于数据库表 user 中的主键,我想创建并命名目录名称。

例如,如果用户注册的主键保存为4,则必须创建一个名为4的目录,并将他上传的文件保存到该目录中。

如何做到这一点?请帮忙。

【问题讨论】:

  • 嗯,你应该简单地创建目录之前......你尝试了什么?
  • 我没有尝试任何东西,因为我没有找到任何相关的解决方案。如何创建子目录
  • 你搜索了吗?? *.com/questions/4384951/…
  • yii2的情况是一样的吗?还是我们有任何相同的小部件?
  • 我不建议使用主键作为目录名称(尤其是当目录可公开访问时)。创建一个唯一令牌作为目录名称,使用 mkdir()(和 chmod())创建目录并将文件上传到此目的地。将目录名称存储在数据库中以链接到用户

标签: yii2 yii2-advanced-app yii2-basic-app yii2-model yii2-validation


【解决方案1】:

这是在另一个目录中创建目录并使用yii框架根据year->month->file_name存储文件的代码 年 - 父目录, 月 - 子目录

然后最后将文件存储在月份目录中:

 $new_file_name   = $_FILES['Book']['name']['image'];
            $path=YII::getPathOfAlias('webroot').'/resources/uploads/';
            $year_folder = $path . date("Y");
            $month_folder = $year_folder . '/' . date("m");


            // change umask to '0' by default to make folder with full permissions
            $oldmask = umask(0);

            /*
            for reference
            https://*.com/questions/3997641/why-cant-php-create-a-directory-with-777-permissions
            */

            !file_exists($year_folder) && mkdir($year_folder , 0777);
            !file_exists($month_folder) && mkdir($month_folder, 0777);
            umask($oldmask);

            $path = $month_folder . '/' . $new_file_name;
            $res = move_uploaded_file ($_FILES['Book']['tmp_name']
                                                    ['image'],$path);
            chmod($path, 0666);

【讨论】:

    【解决方案2】:

    第 1 步:

    在模型文件中使用 'yii\helpers\FileHelper'。

    第 2 步:

    在您正在编写保存文件功能的模型文件中,添加以下行:

    if ($this->validate()) {
        $path = 'uploads/'. USERNAMEHERE .'/'. date('YMD');
        FileHelper::createDirectory($path);
        $this->user_image->saveAs($path .'/'. $this->user_image->baseName . '.' . $this->user_image->extension);
        return true;
    }
    

    【讨论】:

      【解决方案3】:

      在yii2中,你可以使用'yii\helpers\FileHelper'来创建文件夹。

      FileHelper::createDirectory($path, $mode = 0775, $recursive = true);
      

      在你的情况下:

      public function upload()
      {
          if ($this->validate()) {
              $path = 'uploads/'. USERNAMEHERE .'/'. date('YMD');
              FileHelper::createDirectory($path);
              $this->user_image->saveAs($path .'/'. $this->user_image->baseName . '.' . $this->user_image->extension);
              return true;
          } else {
              return false;
          }
      }
      

      【讨论】: