수색…


그것을하는 방법

파일 업로드

Yii에서 파일을 업로드하는 것은 일반적으로 업로드 된 각 파일을 UploadedFile 객체로 캡슐화하는 [[yii \ web \ UploadedFile]]의 도움으로 수행됩니다. [[yii \ widgets \ ActiveForm]] 및 모델과 결합하여 안전한 파일 업로드 메커니즘을 쉽게 구현할 수 있습니다.

모델 만들기

일반 텍스트 입력 작업과 마찬가지로 단일 파일을 업로드하려면 모델 클래스를 만들고 모델의 속성을 사용하여 업로드 된 파일 인스턴스를 유지합니다. 또한 파일 업로드의 유효성을 검사하는 유효성 검사 규칙을 선언해야합니다. 예를 들어,

namespace app\models;

use yii\base\Model;
use yii\web\UploadedFile;

class UploadForm extends Model
{
    /**
     * @var UploadedFile
     */
    public $imageFile;

    public function rules()
    {
        return [
            [['imageFile'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg'],
        ];
    }
    
    public function upload()
    {
        if ($this->validate()) {
            $this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension);
            return true;
        } else {
            return false;
        }
    }
}

위의 코드에서 imageFile 특성은 업로드 된 파일 인스턴스를 유지하는 데 사용됩니다. 확장명이 png 또는 jpg 파일이 업로드되도록 [[yii \ validators \ FileValidator]]를 사용하는 file 유효성 검사 규칙과 연결됩니다. upload() 메서드는 유효성 검사를 수행하고 업로드 된 파일을 서버에 저장합니다.

file 검사기를 사용하면 파일 확장명, 크기, MIME 유형 등을 확인할 수 있습니다. 자세한 내용은 핵심 검사기 섹션을 참조하십시오.

도움말 : 이미지를 업로드하는 경우 image 유효성 검사기를 대신 사용해보십시오. image 유효성 검사기는 [[yii \ validators \ ImageValidator]]를 통해 구현되며 속성이 유효 이미지를 수신했는지 확인한 다음이 상 확장을 사용하여 저장하거나 처리 할 수 ​​있습니다.

렌더링 파일 입력

그런 다음보기에서 파일 입력을 만듭니다.

<?php
use yii\widgets\ActiveForm;
?>

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>

    <?= $form->field($model, 'imageFile')->fileInput() ?>

    <button>Submit</button>

<?php ActiveForm::end() ?>

파일을 올 Y 르게 업로드 할 수 있도록 양식에 enctype 옵션을 추가해야합니다. fileInput() 호출은 사용자가 업로드 할 파일을 선택할 수있게 해주는 <input type="file"> 태그를 렌더링합니다.

팁 : 버전 2.0.8부터 [yii \ web \ widgets \ ActiveField :: fileInput | fileInput]]은 파일 입력 필드가 사용될 때 자동으로 양식에 enctype 옵션을 추가합니다.

배선

이제 컨트롤러 동작에서 파일 업로드를 구현하기 위해 모델과 뷰를 연결하는 코드를 작성합니다.

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;

class SiteController extends Controller
{
    public function actionUpload()
    {
        $model = new UploadForm();

        if (Yii::$app->request->isPost) {
            $model->imageFile = UploadedFile::getInstance($model, 'imageFile');
            if ($model->upload()) {
                // file is uploaded successfully
                return;
            }
        }

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

위의 코드에서 양식이 제출되면 [[yii \ web \ UploadedFile :: getInstance ()]] 메서드가 호출되어 업로드 된 파일을 UploadedFile 인스턴스로 나타냅니다. 그런 다음 모델 유효성 검사를 사용하여 업로드 된 파일이 유효한지 확인하고 파일을 서버에 저장합니다.

여러 파일 업로드

이전 서브 섹션에 나열된 코드를 약간 조정하여 한 번에 여러 파일을 업로드 할 수도 있습니다.

먼저 file 유효성 검사 규칙에 maxFiles 옵션을 추가하여 모델 클래스를 조정하여 업로드 할 수있는 최대 파일 수를 제한해야합니다. maxFiles0 설정하면 동시에 업로드 할 수있는 파일 수에 제한이 없음을 의미합니다. 동시에 업로드 할 수있는 파일의 최대 수는 max_file_uploads 기본값 : 20) 인 PHP 지시어로도 제한됩니다. upload() 된 파일을 하나씩 저장하려면 upload() 메소드도 업데이트해야합니다.

namespace app\models;

use yii\base\Model;
use yii\web\UploadedFile;

class UploadForm extends Model
{
    /**
     * @var UploadedFile[]
     */
    public $imageFiles;

    public function rules()
    {
        return [
            [['imageFiles'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg', 'maxFiles' => 4],
        ];
    }
    
    public function upload()
    {
        if ($this->validate()) { 
            foreach ($this->imageFiles as $file) {
                $file->saveAs('uploads/' . $file->baseName . '.' . $file->extension);
            }
            return true;
        } else {
            return false;
        }
    }
}

뷰 파일에서 파일 업로드 필드가 여러 파일을받을 수 있도록 fileInput() 호출에 multiple 옵션을 추가해야합니다.

<?php
use yii\widgets\ActiveForm;
?>

<?php $form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]) ?>

    <?= $form->field($model, 'imageFiles[]')->fileInput(['multiple' => true, 'accept' => 'image/*']) ?>

    <button>Submit</button>

<?php ActiveForm::end() ?>

그리고 마지막으로 컨트롤러 액션에, 당신은 호출해야 UploadedFile::getInstances() 대신 UploadedFile::getInstance() 배열 할당 UploadedFile 하는 인스턴스를 UploadForm::imageFiles .

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\UploadForm;
use yii\web\UploadedFile;

class SiteController extends Controller
{
    public function actionUpload()
    {
        $model = new UploadForm();

        if (Yii::$app->request->isPost) {
            $model->imageFiles = UploadedFile::getInstances($model, 'imageFiles');
            if ($model->upload()) {
                // file is uploaded successfully
                return;
            }
        }

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


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow