Commit ccf94b55 by Nobuo Kihara

docs/guide/input-file-upload.md - revised a bit [ci skip]

parent c9b86b1d
Uploading Files Uploading Files
=============== ===============
Uploading files in Yii is done via the a form model, its validation rules and some controller code. Let's review what's Uploading files in Yii is done via a form model, its validation rules and some controller code. Let's review what's
required to handle uploads properly. required to handle uploads properly.
...@@ -39,7 +39,7 @@ class UploadForm extends Model ...@@ -39,7 +39,7 @@ class UploadForm extends Model
} }
``` ```
In the code above, we've created a model `UploadForm` with an attribute `$file` that will become `<input type="file">` in In the code above, we've created a model `UploadForm` with an attribute `file` that will become `<input type="file">` in
the HTML form. The attribute has the validation rule named `file` that uses [[yii\validators\FileValidator|FileValidator]]. the HTML form. The attribute has the validation rule named `file` that uses [[yii\validators\FileValidator|FileValidator]].
### Form view ### Form view
...@@ -65,7 +65,7 @@ input field. ...@@ -65,7 +65,7 @@ input field.
### Controller ### Controller
Now create the controller that connects the form and model together: Now create the controller that connects the form and the model together:
```php ```php
namespace app\controllers; namespace app\controllers;
...@@ -95,13 +95,16 @@ class SiteController extends Controller ...@@ -95,13 +95,16 @@ class SiteController extends Controller
``` ```
Instead of `model->load(...)`, we are using `UploadedFile::getInstance(...)`. [[\yii\web\UploadedFile|UploadedFile]] Instead of `model->load(...)`, we are using `UploadedFile::getInstance(...)`. [[\yii\web\UploadedFile|UploadedFile]]
does not run the model validation, rather it only provides information about the uploaded file. Therefore, you need to run the validation manually via `$model->validate()` to trigger the [[yii\validators\FileValidator|FileValidator]] that expects a file: does not run the model validation, rather it only provides information about the uploaded file. Therefore, you need to run the validation manually via `$model->validate()` to trigger the [[yii\validators\FileValidator|FileValidator]]. The validator expects that
the attribute is an uploaded file, as you see in the core framework code:
```php ```php
$file instanceof UploadedFile || $file->error == UPLOAD_ERR_NO_FILE //in the code framework if (!$file instanceof UploadedFile || $file->error == UPLOAD_ERR_NO_FILE) {
return [$this->uploadRequired, []];
}
``` ```
If validation is successful, then we're saving the file: If the validation is successful, then we're saving the file:
```php ```php
$model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension); $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
...@@ -241,6 +244,6 @@ class SiteController extends Controller ...@@ -241,6 +244,6 @@ class SiteController extends Controller
} }
``` ```
There are two differences from single file upload. First is that `UploadedFile::getInstances($model, 'file');` used There are two differences from single file upload. First is that `UploadedFile::getInstances($model, 'file');` is used
instead of `UploadedFile::getInstance($model, 'file');`. The former returns instances for **all** uploaded files while instead of `UploadedFile::getInstance($model, 'file');`. The former returns instances for **all** uploaded files while
the latter gives you only a single instance. The second difference is that we're doing `foreach` and saving each file. the latter gives you only a single instance. The second difference is that we're doing `foreach` and saving each file.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment