yii2
Upload di file
Ricerca…
Come farlo
Caricamento di file
Il caricamento dei file in Yii avviene di solito con l'aiuto di [[yii \ web \ UploadedFile]] che incapsula ogni file caricato come oggetto UploadedFile
. In combinazione con [[yii \ widgets \ ActiveForm]] e modelli, è possibile implementare facilmente un meccanismo di caricamento sicuro dei file.
Creazione di modelli
Come quando si utilizzano input di testo normale, per caricare un singolo file si crea una classe del modello e si utilizza un attributo del modello per mantenere l'istanza del file caricato. Devi anche dichiarare una regola di convalida per convalidare il caricamento del file. Per esempio,
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; } } }
Nel codice sopra, l'attributo imageFile
viene utilizzato per mantenere l'istanza del file caricato. È associato a una regola di convalida dei file
che utilizza [[yii \ validators \ FileValidator]] per garantire che un file con estensione nome png
o jpg
sia caricato. Il metodo upload()
eseguirà la convalida e salverà il file caricato sul server.
Il validatore di file
ti consente di controllare le estensioni dei file, le dimensioni, il tipo MIME, ecc. Per ulteriori dettagli, fai riferimento alla sezione Validatori di base.
Suggerimento: se stai caricando un'immagine, puoi prendere in considerazione l'utilizzo del validatore di
image
. Il validatore diimage
è implementato tramite [[yii \ validators \ ImageValidator]] che verifica se un attributo ha ricevuto un'immagine valida che può essere quindi salvata o elaborata utilizzando l' estensione Imagine .
Input del file di rendering
Successivamente, crea un input di file in 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() ?>
È importante ricordare che si aggiunge l'opzione enctype
al modulo in modo che il file possa essere caricato correttamente. La chiamata fileInput()
eseguirà il rendering di un <input type="file">
che consentirà agli utenti di selezionare un file da caricare.
Suggerimento: dalla versione 2.0.8, [[yii \ web \ widgets \ ActiveField :: fileInput | fileInput]] aggiunge
enctype
opzioneenctype
al modulo quando viene utilizzato il campo di input del file.
Cablaggio
Ora in un'azione controller, scrivi il codice per collegare il modello e la vista per implementare il caricamento dei file:
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]); } }
Nel codice precedente, quando viene inviato il modulo, viene chiamato il metodo [[yii \ web \ UploadedFile :: getInstance ()]] per rappresentare il file caricato come istanza di UploadedFile
. Ci affidiamo quindi alla convalida del modello per assicurarci che il file caricato sia valido e salvare il file sul server.
Caricamento di più file
Puoi anche caricare più file contemporaneamente, con alcune modifiche al codice elencato nelle sottosezioni precedenti.
Innanzitutto è necessario regolare la classe del modello aggiungendo l'opzione maxFiles
nella regola di convalida dei file
per limitare il numero massimo di file consentiti per il caricamento. L'impostazione di maxFiles
su 0
significa che non esiste un limite al numero di file che possono essere caricati simultaneamente. Il numero massimo di file che possono essere caricati simultaneamente è anche limitato dalla direttiva PHP max_file_uploads
, che ha valore predefinito 20. Il metodo upload()
dovrebbe anche essere aggiornato per salvare i file caricati uno per 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; } } }
Nel file di visualizzazione, è necessario aggiungere l'opzione multiple
alla chiamata fileInput()
modo che il campo di caricamento del file possa ricevere più file:
<?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() ?>
Infine, nell'azione del controller, è necessario chiamare UploadedFile::getInstances()
anziché UploadedFile::getInstance()
per assegnare un array di istanze di 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]); } }