webentwicklung-frage-antwort-db.com.de

Wie kann ich eine Datei in ein Verzeichnis in yii2 hochladen?

ich habe ein ActiveForm, und ich möchte ein Feld hinzufügen, in dem der Benutzer seine Fotos hochladen kann. Das Problem ist, dass ich kein Attribut für das Bild in der Benutzertabelle und jedes Eingabefeld in. yii 'erwartet ein Modell und ein Attribut wie folgt.

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

ich möchte das Bild keinem Datensatz zuweisen oder in die Datenbank einfügen. Ich möchte, dass es in einen bestimmten Ordner hochgeladen wird.

ich habe auch die Bibliothek überprüft, die kartik schrieb, erfordert aber auch ein Attributfeld.

24
tareq

Folgen Sie der offiziellen Dokumentation

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

Formularmodell

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'],
    ];
}
}
?>

Formularansicht

<?php
use yii\widgets\ActiveForm;

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

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

<button>Submit</button>

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

Regler

Erstellen Sie nun den Controller, der Form und Modell miteinander verbindet:

<?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]);
}
}
?>

Anstelle von model->load(...) verwenden wir UploadedFile::getInstance(...). [[\yii\web\UploadedFile|UploadedFile]] führt die Modellvalidierung nicht aus. Es enthält nur Informationen zur hochgeladenen Datei. Daher müssen Sie die Validierung manuell über $model->validate() ausführen. Dies löst den [[yii\validators\FileValidator|FileValidator]] aus, der eine Datei erwartet:

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

Wenn die Überprüfung erfolgreich ist, speichern wir die Datei:

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

Wenn Sie eine "grundlegende" Anwendungsvorlage verwenden, sollten Ordneruploads unter Web erstellt werden.

Das ist es. Laden Sie die Seite und laden Sie sie hoch. Uplaods sollten in basic/web/uploads enden.

45
Devy

aus deiner Sicht

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();

in Ihrem Controller

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

Erstellen Sie ein schreibgeschütztes Attribut für Ihr Modell wie public $imageund verfahren Sie wie 

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

Ich mag wirklich Yii2 Dropzone .

Installation:

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

Verwendungszweck:

<?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')}"
       ],
   ]);

   ?>

Regler:

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

geben Sie diesen Code nach Ihrem hochgeladenen Code ein

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

Wenn Sie beim Hochladen mehr als eine Datei haben, müssen Sie dafür foreach verwenden. Und Sie sollten den tatsächlichen Dateinamen in einer Spalte in der Tabelle angeben. Ein verschlüsselter Wert dieses Namens muss gespeichert werden, um ein Duplizieren im Verzeichnis zu vermeiden. Etwas in der Art.

$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();
}

Hier wird eine zufällige Zeichenfolge generiert, mit der der Name des Dokuments zugewiesen und in der Tabelle gespeichert wird. Die UserDocs ist der Modellname.

0
Salman Riyaz