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]);
}
}