yii2
파일 업로드
수색…
그것을하는 방법
파일 업로드
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
옵션을 추가하여 모델 클래스를 조정하여 업로드 할 수있는 최대 파일 수를 제한해야합니다. maxFiles
를 0
설정하면 동시에 업로드 할 수있는 파일 수에 제한이 없음을 의미합니다. 동시에 업로드 할 수있는 파일의 최대 수는 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]); } }