2016-08-07 70 views
1

Ich habe Datei-Upload-Funktion zu meinem Controller hinzugefügt, Datei wird im angegebenen Verzeichnis gespeichert, aber Ansichten wie Update, Index, Ansicht zeigt nur den Namen der Datei. Ich brauche einen Link oder eine Schaltfläche, um mit dieser hochgeladenen Datei zu interagieren. Zum Beispiel Öffnen der Datei durch Drücken auf diesen Link oder Schaltfläche auch Herunterladen dieser Datei. Könntest du mir dabei helfen?Wie kann ich hochgeladene Dateien in yii2 Ansichten anzeigen und damit interagieren?

Modell:

public function rules() 
{ 
    return [ 
    ... 
     [['attachment'],'file'], 
    ]; 
} 

Controller:

public function actionCreate() 
{ 
    $model = new Letter(); 

    if ($model->load(Yii::$app->request->post())) { 
     $model->attachment = UploadedFile::getInstance($model, 'attachment'); 

     $filename = pathinfo($model->attachment , PATHINFO_FILENAME); 
     $ext = pathinfo($model->attachment , PATHINFO_EXTENSION); 

     $newFname = $filename.'.'.$ext; 

     $path=Yii::getAlias('@webroot').'/uploads/'; 
     if(!empty($newFname)){ 
      $model->attachment->saveAs($path.$newFname); 
      $model->attachment = $newFname; 
      if($model->save()){ 
       return $this->redirect(['view', 'id' => $model->id]); 
      } 
     } 
    } 
    return $this->render('create', [ 
     'model' => $model, 
    ]); 

Formularansicht:

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

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

<div class="form-group"> 
    <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> 
</div> 

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

Vielen Dank im Voraus.

Antwort

1

Update Ihrer Formularansicht wie unten:

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

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

/*link to download file*/ 
<?if(!$model->isNewRecord):?> 
<?= Html::a('Download file', ['download', 'id' => $model->id], ['class' => 'btn btn-primary']) ?> 
<?endif;?> 

<div class="form-group"> 
    <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> 
</div> 


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

in Ihrem Controller neue Aktion zur Download-Datei hinzufügen:

public function actionDownload($id) 
{ 
    $download = Letter::findOne($id); 
    $path=Yii::getAlias('@webroot').'/uploads/'.$download->attachment; 

    if (file_exists($path)) { 
     return Yii::$app->response->sendFile($path); 
    } 
} 

in Ihrer Kurzansicht:

<?= GridView::widget([ 
'dataProvider' => $dataProvider, 
'id'=>'mygrid', 
'columns' => [ 
['class' => 'yii\grid\SerialColumn'], 



[ 
'attribute'=>'attachment', 
'format'=>'raw', 
'value' => function($data) 
{ 
    return 
    Html::a('Download file', ['letter/download', 'id' => $data->id], ['class' => 'btn btn-primary']); 

} 
], 

], 
]); ?> 
+0

Hallo, danke für Antworten. Es sagt undefinierte Variable $ Modell. Soll ich das als Parameter hinzufügen oder die globale Variable $ model = new Letter() erstellen? –

+0

@VitalyPark aktualisiert Controller-Code Bitte überprüfen Sie es jetzt – jithin

+0

Etwas wird falsch mit If-Anweisung in der Formularansicht. Der Teil "isNewRecord):?>" Erscheint wie ein einfacher Text. –