yii2
Filuppladdningar
Sök…
Hur man gör det
Ladda upp filer
Överföring av filer i Yii görs vanligtvis med hjälp av [[yii \ web \ UploadedFile]] som kapslar in varje uppladdad fil som ett UploadedFile
objekt. Kombinerat med [[yii \ widgets \ ActiveForm]] och modeller kan du enkelt implementera en säker mekanism för överföring av filer.
Skapa modeller
Som att arbeta med inmatningar av vanlig text, för att ladda upp en enda fil skulle du skapa en modellklass och använda ett attribut för modellen för att behålla den uppladdade filinstansen. Du bör också förklara en valideringsregel för att validera filöverföringen. Till exempel,
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; } } }
I koden ovan används imageFile
attributet för att behålla den uppladdade filinstansen. Det är förenat med en file
valideringsregel som användningsområden [[Yii \ mekanismerna \ FileValidator]] för att säkerställa en fil med ändelsen namn png
eller jpg
laddas upp. Metoden upload()
utför valideringen och sparar den överförda filen på servern.
Den file
validator kan du kontrollera filnamnstillägg, storlek, MIME-typ, etc. Se Core Validators avsnittet för mer information.
Tips: Om du laddar upp en bild kan du överväga att använda
image
validator istället. Denimage
validator implementeras via [[Yii \ validatorer \ ImageValidator]], som verifierar om ett attribut har mottagit en giltig bild som kan sedan antingen sparas eller bearbetas med användning av Föreställ Extension .
Rendering File Input
Skapa sedan en filinmatning i en vy:
<?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() ?>
Det är viktigt att komma ihåg att du lägger till enctype
alternativet i formuläret så att filen kan laddas upp ordentligt. fileInput()
ger en <input type="file">
tagg som gör det möjligt för användare att välja en fil att ladda upp.
Tips: eftersom version 2.0.8 lägger [[yii \ web \ widgets \ ActiveField :: fileInput | fileInput]] till
enctype
alternativ till formen automatiskt när filinmatningsfältet används.
Anslutning
Skriv nu koden för att koppla upp modellen och vyn för att implementera filöverföring: i en kontrollåtgärd:
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]); } }
I koden ovan, när formuläret skickas, kallas metoden [[yii \ web \ UploadedFile :: getInstance ()]] för att representera den överförda filen som en UploadedFile
instans. Vi litar sedan på modellvalideringen för att se till att den laddade filen är giltig och spara filen på servern.
Ladda upp flera filer
Du kan också ladda upp flera filer samtidigt, med några justeringar av koden som listas i föregående underavsnitt.
Först bör du justera modellen klassen genom att tillsätta maxFiles
alternativet i file
valideringsregeln att begränsa det maximala antalet filer får ladda upp. Att ställa maxFiles
till 0
betyder att det inte finns någon gräns för antalet filer som kan laddas upp samtidigt. Det maximala antalet filer som kan laddas upp samtidigt är också begränsat med PHP-direktivet max_file_uploads
, som är standard till 20. upload()
bör också uppdateras för att spara de uppladdade filerna en och en.
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; } } }
I visningsfilen ska du lägga till multiple
alternativ i fileInput()
så att fileInput()
kan ta emot flera filer:
<?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() ?>
Och slutligen i kontrolleråtgärden, bör du ringa UploadedFile::getInstances()
istället för UploadedFile::getInstance()
att tilldela en matris av UploadedFile
instanser till 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]); } }