Сохранить несколько файлов изображений с помощью Kartik FileInput Widget

Я в настоящее время использую Yii2 PHP Framework и Kartik FileInput Виджет в моей системе. Я использовал следовал это руководство загрузок входного файла на несколько файлов, но это не сработало в моей системе. В настоящее время я использую MongoDB в качестве базы данных. Вот мой прогресс (оригинал, только одна загрузка):

контроллер, actionCreate

if($model->load(Yii::$app->request->post())) {

$model->attachment = UploadedFile::getInstance($model, 'attachment');

if($model->attachment) {
$path = 'archive/contact/' . $model->attachment->baseName . '.' . $model->attachment->extension;
$count = 0;
{
while(file_exists($path)) {
$path = 'archive/contact/' . $model->attachment->baseName . '_'.$count.'.' . $model->attachment->extension;
$count++;
}
}
$model->attachment->saveAs($path);
$model->attachment =  $path;
}

$model->save();

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

Посмотреть

echo FileInput::widget([
'model' => $model,
'attribute' => 'attachment[]',
'name' => 'attachment[]',
'options' => [
'multiple' => true,
'accept' => 'image/*'
],
'pluginOptions' => [
'showCaption' => false,
'showRemove' => false,
'showUpload' => false,
'browseClass' => 'btn btn-primary btn-block',
'browseIcon' => '<i class="glyphicon glyphicon-camera"></i> ',
'browseLabel' =>  'Attach Business Card',
'allowedFileExtensions' => ['jpg','gif','png'],
'overwriteInitial' => false
],
]);

Я также буду в том числе мой модель

class Contact extends ActiveRecord
{
/**
* @inheritdoc
*/
public static function collectionName()
{
return ['iaoy', 'contact'];
}

/**
* @inheritdoc
*/
public function attributes()
{
return [
'_id', 'fname','lname','email','phone','address','contact_type','business_name','notes','company_id','date_added','attachment','sort'
];
}

/**
* @inheritdoc
*/
public function rules()
{
return [
[['_id', 'fname','lname','email','phone','address','contact_type','business_name','notes','company_id','date_added','attachment','sort'], 'safe'],
[['fname','lname','contact_type','business_name'], 'required'],
[['attachment'], 'file', 'extensions' => ['png', 'jpg', 'gif'], 'maxSize' => 500*500],
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
//'contact_id' => 'Contact ID',
'_id' => 'Contact ID',
'contact_type' => 'Contact Type',
'business_name' => 'Business Name',
'fname' => 'First Name',
'lname' => 'Last Name',
'email' => 'Email',
'phone' => 'Phone',
'address' => 'Address',
'notes' => 'Notes',
'attachment' => 'Attachment',
'company_id' => 'Company ID',
];
}
}

Как реализовать загрузку нескольких файлов, если это уже реализовано? Любые мысли высоко ценятся.

РЕДАКТИРОВАТЬ:

Вот мой код загрузки мультифайлов. Я не смешал его с моим текущим кодом (загрузка одного файла), вместо этого я сделал новый MVC. Это в основном то, что я нашел в руководстве, которое я упоминал выше, с очень небольшими изменениями:

модель

<?php

namespace app\models;

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

class Upload extends Model
{
public $file;

public function attributes()
{
return [
'file', 'urls'
];
}

public function rules()
{
return [
[['file', 'urls'], 'safe'],
[['file'], 'file','extensions' => 'png, jpg'],
[['urls'],'string'],
];
}
}

Посмотреть

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use kartik\file\FileInput;

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

<?php
echo FileInput::widget([
'model' => $model,
'attribute' => 'file[]',
'name' => 'file[]',
'options' => [
'multiple' => true,
'accept' => 'image/*'
],
'pluginOptions' => [
'showCaption' => false,
'showRemove' => false,
'showUpload' => false,
'browseClass' => 'btn btn-primary btn-block',
'browseIcon' => '<i class="glyphicon glyphicon-camera"></i> ',
'browseLabel' =>  'Attach Business Card',
'allowedFileExtensions' => ['jpg','gif','png'],
'overwriteInitial' => false
],
]);
?>
<button>Submit</button>

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

контроллер

public function actionUpload()
{
$model = new Upload();

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

foreach ($model->file as $key => $file) {
$file->saveAs('archive/reimbursement/'. $file->baseName . '.' . $file->extension);//Upload files to server
$model->urls .= 'archive/reimbursement/' . $file->baseName . '.' . $file->extension.'**';//Save file names in database- '**' is for separating images
}
$model->save();
return $this->redirect(['viewuploads', 'id' => $model->id]);
} else {
return $this->render('upload', [
'model' => $model,
]);
}
}

Я также добавил 'urls' в моем contact.php модель rules функция

3

Решение

Попробуй это:

контроллер:
Вы должны сохранить имя изображения в базе данных (‘$ model-> urls’)

public function actionUpload()
{
$model = new Upload();

if ($model->load(Yii::$app->request->post())) {
$model->file = UploadedFile::getInstances($model, 'file');
foreach ($model->file as $key => $file) {

$file->saveAs('/uploads/'. $file->baseName . '.' . $file->extension);//Upload files to server
$model->urls .= 'uploads/' . $file->baseName . '.' . $file->extension.'**';//Save file names in database- '**' is for separating images
}
$model->save();
return $this->redirect(['view', 'id' => $model->id]);
} else {
return $this->render('upload', [
'model' => $model,
]);
}
}

Посмотреть

<?= $form->field($model, 'file[]')->widget(FileInput::classname(), [
'options' => ['multiple' => 'true'],
]) ?>

модель

class Upload extends Model
{
public $file;
public function rules()
{
return [
[['file'], 'file','maxFiles' => 6],
[['urls'],'string'],

];
}

Другой вид для отображения изображений

<?php
$images=explode('**',trim($model->urls));
foreach($images as $image)
{
echo Html::img(Url::to('@web/' . $image, true));
}
?>
4

Другие решения

Я уже давно слышал о проблеме загрузки нескольких изображений с данными формы.
Это было мое решение, надеюсь, это может помочь любому

контроллер

public function actionCreate()
{
$createRoom = new Room();

if ($createRoom->load(Yii::$app->request->post())) {
$createRoom->roomFiles = UploadedFile::getInstances($createRoom, 'roomFiles');

foreach ($createRoom->roomFiles as $key => $file) {
$file->saveAs('uploads/'. $file->baseName . '.' . $file->extension);//Upload files to server
$createRoom->room_images .= 'uploads/' . $file->baseName . '.' . $file->extension.'**';//Save file names in database- '**' is for separating images
}
$createRoom->save(false);
return $this->redirect(['view', 'id' => $createRoom->room_id]);
} else {
return $this->render('create', [
'createRoom' => $createRoom,
]);
}
}

создать вид

<?= $form->field($createRoom, 'roomFiles[]')->fileInput(['multiple' => true, 'accept' => 'image/*']) ?>

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

Модель комнаты

public function rules()
{
return [

[['roomFiles'],  'file', 'skipOnEmpty' => false, 'extensions' =>     'png, jpg','maxFiles' => 4],

];
}
0

В моем случае я должен установить сохранить как путь по-другому

$uploadDir =  Yii::getAlias('@webroot/') . Yii::getAlias('@web/uploads');
foreach ($model->file as $key => $file) {
$file->saveAs($uploadDir . '/'. $file->baseName . '.' . $file->extension);//Upload files to server
}
0
По вопросам рекламы [email protected]