web-dev-qa-db-fra.com

Comment télécharger un fichier dans le répertoire yii2?

j'ai un ActiveForm, et je veux ajouter un champ où l'utilisateur peut télécharger ses photos . le problème est que je n'ai pas d'attribut pour l'image dans la table users et chaque champ de saisie. yii 'attend un modèle et un attribut comme suit.

<?= $form->field($model, 'attribute')->input($platforms) ?>

je ne veux pas assigner l'image à un enregistrement ni je veux l'insérer dans la base de données, je veux qu'elle soit téléchargée dans un dossier spécifique.

j'ai également vérifié la bibliothèque écrite par kartik, mais nécessite également un champ d'attribut.

24
tareq

Suivez la documentation officielle

https://github.com/yiisoft/yii2/blob/master/docs/guide/input-file-upload.md

Modèle de formulaire

namespace app\models;

use yii\base\Model;
use yii\web\UploadedFile;

/**
* UploadForm is the model behind the upload form.
*/
class UploadForm extends Model
{
/**
 * @var UploadedFile|Null file attribute
 */
public $file;

/**
 * @return array the validation rules.
 */
public function rules()
{
    return [
        [['file'], 'file'],
    ];
}
}
?>

Formulaire

<?php
use yii\widgets\ActiveForm;

$form = ActiveForm::begin(['options' => ['enctype' => 'multipart/form-data']]); ?>

<?= $form->field($model, 'file')->fileInput() ?>

<button>Submit</button>

<?php ActiveForm::end(); ?>

Manette

Créez maintenant le contrôleur qui relie le formulaire et le modèle ensemble:

<?php
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->file = UploadedFile::getInstance($model, 'file');

        if ($model->validate()) {                
            $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);
        }
    }

    return $this->render('upload', ['model' => $model]);
}
}
?>

Au lieu de model->load(...), nous utilisons UploadedFile::getInstance(...). [[\yii\web\UploadedFile|UploadedFile]] n'exécute pas la validation du modèle. Il fournit uniquement des informations sur le fichier téléchargé. Par conséquent, vous devez exécuter la validation manuellement via $model->validate(). Cela déclenche le [[yii\validators\FileValidator|FileValidator]] qui attend un fichier:

 $file instanceof UploadedFile || $file->error == UPLOAD_ERR_NO_FILE //in code framework

Si la validation réussit, nous enregistrons le fichier:

 $model->file->saveAs('uploads/' . $model->file->baseName . '.' . $model->file->extension);

Si vous utilisez un modèle d'application "de base", les téléchargements de dossiers doivent être créés sous Web.

C'est tout. Chargez la page et essayez de télécharger. Les uplaods devraient se retrouver dans basic/web/uploads.

45
Devy

à votre avis

use kartik\widgets\ActiveForm;
use kartik\widgets\FileInput;

$form = ActiveForm::begin(['options' => ['enctype'=>'multipart/form-data']]); //important
echo FileInput::widget([
                    'name' => 'filename',
                    'showUpload' => false,
                    'buttonOptions' => ['label' => false],
                    'removeOptions' => ['label' => false],
                    'groupOptions' => ['class' => 'input-group-lg']
                ]);
echo Html::submitButton('Submit', ['class'=>'btn btn-primary']);
ActiveForm::end();

dans votre contrôleur

$file = \yii\web\UploadedFile::getInstanceByName('filename');
$file->saveAs('/your/directory/'.$file->name);
14
Aditya Dharma

Créez un attribut en lecture seule pour votre modèle, tel que public $imageet procédez comme 

 <?= $form->field($model, 'image')->fileInput() ?>
6
Dency G B

J'aime beaucoup Yii2 Dropzone .

Installation:

composer require --prefer-dist perminder-klair/yii2-dropzone "dev-master"

Usage:

<?php 
    echo \kato\DropZone::widget([
       'options' => [
           'url'=> Url::to(['resource-manager/upload']),
           'paramName'=>'image',
           'maxFilesize' => '10',
       ],
       'clientEvents' => [
           'complete' => "function(file){console.log(file)}",
           'removedfile' => "function(file){alert(file.name + ' is removed')}"
       ],
   ]);

   ?>

Manette:

public function actionUpload(){

        $model = new ResourceManager();
        $uploadPath = Yii::getAlias('@root') .'/uploads/';

        if (isset($_FILES['image'])) {
            $file = \yii\web\UploadedFile::getInstanceByName('image');
          $original_name = $file->baseName;  
          $newFileName = \Yii::$app->security
                            ->generateRandomString().'.'.$file->extension;
           // you can write save code here before uploading.
            if ($file->saveAs($uploadPath . '/' . $newFileName)) {
                $model->image = $newFileName;
                $model->original_name = $original_name;
                if($model->save(false)){
                    echo \yii\helpers\Json::encode($file);
                }
                else{
                    echo \yii\helpers\Json::encode($model->getErrors());
                }

            }
        }
        else {
            return $this->render('upload', [
                'model' => $model,
            ]);
        }

        return false;
    }
2
Muhammad Shahzad

donner ce code après votre code téléchargé

  //save the path in DB..
                $model->file = 'uploads/'.$imageName.'.'.$model->file->extension;
                $model->save();
0

Si vous avez plusieurs fichiers en cours de téléchargement, vous devez utiliser foreach pour cela. Et vous devriez nommer le fichier dans une colonne de la table et enregistrer une valeur chiffrée de ce nom pour éviter les doublons dans le répertoire.

$userdocs->document_name = UploadedFile::getInstances($userdocs, 'document_name');

foreach ($userdocs->document_name as $key => $file) {
  $img_name = Yii::$app->security->generateRandomString();
  $file->saveAs('user/business_files/' . $img_name . '.' . $file->extension);
  $images = $img_name . '.' . $file->extension;
  $userdocs->actual_name = $file->name;
  $userdocs->user_id = $user->id;
  $userdocs->document_name = $images;
  $userdocs->save(false);
  $userdocs = new UserDocs();
}

Ici, une chaîne aléatoire est générée et elle sera assignée avec le nom du document et sera stockée dans la table. UserDocs est le nom du modèle.

0
Salman Riyaz