yii2
Cargas de archivos
Buscar..
Cómo hacerlo
Cargando archivos
La carga de archivos en Yii se realiza generalmente con la ayuda de [[yii \ web \ UploadedFile]], que encapsula cada archivo cargado como un objeto UploadedFile
. Combinado con [[yii \ widgets \ ActiveForm]] y modelos, puede implementar fácilmente un mecanismo seguro de carga de archivos.
Creando Modelos
Al igual que trabajar con entradas de texto sin formato, para cargar un solo archivo, crearía una clase de modelo y usaría un atributo del modelo para mantener la instancia del archivo cargado. También debe declarar una regla de validación para validar la carga del archivo. Por ejemplo,
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; } } }
En el código anterior, el atributo imageFile
se usa para mantener la instancia del archivo cargado. Se asocia con una regla de validación de file
que utiliza [[yii \ validators \ FileValidator]] para garantizar que se cargue un archivo con el nombre de extensión png
o jpg
. El método upload()
realizará la validación y guardará el archivo cargado en el servidor.
El validador de file
permite verificar las extensiones de archivo, el tamaño, el tipo MIME, etc. Consulte la sección Validadores básicos para obtener más detalles.
Sugerencia: si está cargando una imagen, puede considerar usar el validador de
image
. El validador deimage
se implementa a través de [[yii \ validators \ ImageValidator]] que verifica si un atributo ha recibido una imagen válida que se puede guardar o procesar con la Extensión de Imagine .
Archivo de entrada de render
A continuación, cree una entrada de archivo en una vista:
<?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() ?>
Es importante recordar que agrega la opción enctype
al formulario para que el archivo se pueda cargar correctamente. La llamada fileInput()
mostrará una etiqueta <input type="file">
que permitirá a los usuarios seleccionar un archivo para cargar.
Consejo: desde la versión 2.0.8, [[yii \ web \ widgets \ ActiveField :: fileInput | fileInput]] agrega la opción
enctype
al formulario automáticamente cuando se usa el campo de entrada del archivo.
Cableado
Ahora, en una acción del controlador, escriba el código para conectar el modelo y la vista para implementar la carga de archivos:
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]); } }
En el código anterior, cuando se envía el formulario, se llama al método [[yii \ web \ UploadedFile :: getInstance ()]] para representar el archivo cargado como una instancia de UploadedFile
. Luego confiamos en la validación del modelo para asegurarnos de que el archivo cargado sea válido y guarde el archivo en el servidor.
Subiendo múltiples archivos
También puede cargar varios archivos a la vez, con algunos ajustes al código enumerados en las subsecciones anteriores.
Primero debe ajustar la clase del modelo agregando la opción maxFiles
en la regla de validación de file
para limitar el número máximo de archivos que se pueden cargar. Establecer maxFiles
en 0
significa que no hay límite en la cantidad de archivos que se pueden cargar simultáneamente. El número máximo de archivos que se pueden cargar simultáneamente también está limitado con la directiva de PHP max_file_uploads
, cuyo valor predeterminado es 20. El método upload()
también debe actualizarse para guardar los archivos cargados uno por uno.
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; } } }
En el archivo de vista, debe agregar la opción multiple
a la llamada fileInput()
para que el campo de carga de archivos pueda recibir varios archivos:
<?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() ?>
Y finalmente, en la acción del controlador, debe llamar a UploadedFile::getInstances()
lugar de UploadedFile::getInstance()
para asignar una matriz de instancias de UploadedFile
a 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]); } }