Yii2 Загрузка нескольких файлов не работает

Мне удалось попробовать один, но это не работает в моем конце: http://www.yiiframework.com/doc-2.0/guide-input-file-upload.html

Там нет сообщения об ошибке, и данные не сохраняются в базе данных (MongoDB). Вот мои фрагменты кода:

contact.php модель

class Contact extends ActiveRecord
{
public $file;

public $attachment;

/**
* @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', 'urls'
];
}

/**
* @inheritdoc
*/
public function rules()
{
return [
[['_id', 'fname','lname','email','phone','address','contact_type','business_name','notes','company_id','date_added','attachment','sort', 'urls'], 'safe'],
[['fname','lname','contact_type','business_name'], 'required'],
[['attachment'], 'file', 'skipOnEmpty' => false, 'extensions' => 'png, jpg', 'maxFiles' => 10, 'maxSize'=>20*1024*1024,],
//[['urls'],'string'],
];
}

/**
* @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',
];
}

public function upload()
{
if ($this->validate()) {
foreach ($this->attachment as $file) {
$file->saveAs('archive/contact/' . $file->baseName . '.' . $file->extension);
}
return true;
} else {
return false;
}
}
}

ContactController.php контроллер

public function actionCreate()
{
$session = Yii::$app->session;
$model = new Contact();

if($model->load(Yii::$app->request->post())) {
//if (Yii::$app->request->isPost) {
$model->company_id = new \MongoId($session['company_id']);

date_default_timezone_set('Asia/Manila');
$model->date_added = date('d-m-Y', time());

$model->attachment = UploadedFile::getInstance($model, 'attachment');
/*if($model->attachment) {
foreach ($model->attachment as $key => $file) {
$file->saveAs('archive/contact/'. $file->baseName . '.' . $file->extension); //Upload files to server
$model->urls .= 'archive/contact/' . $file->baseName . '.' . $file->extension.'**'; //Save file names in database- '**' is for separating images
}

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

if($model->save()) {
Yii::$app->session->setFlash('success', "Successfully created contact!");
} else {
$model->save();
if($model->save()) {
Yii::$app->session->setFlash('success', "Successfully created contact!");
} else {
Yii::$app->session->setFlash('error', "Contact creation failed!");
}
}

$model->refresh();
return $this->redirect(['index', 'id' => $session['user_id']]);

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

_form.php Посмотреть

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
],
]);

Я не уверен, что, кажется, не хватает или неправильно. Это потому, что я использую MongoDB или виджет Картика? Пожалуйста, дайте мне знать ваши мысли ниже.

3

Решение

Я наконец получил это. Вот что я сделал:

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

if ($model->attachment) {
foreach ($model->attachment as $attachment) {
$path = 'archive/contact/' . $attachment->baseName . '.' . $attachment->extension;
$count = 0;
{
while(file_exists($path)) {
$path = 'archive/contact/' . $attachment->baseName . '_'.$count.'.' . $attachment->extension;
$count++;
}
}
$attachment->saveAs($path);
$files[] = $path;
}
$model->attachment = implode(',', $files);
}

$model->save();

Во-первых, я забыл, что это должно быть getInstances() с ‘s’, так как это загрузка нескольких файлов. Затем я положил код в foreach цикл затем используется implode сохранить URL-адреса / пути в виде строк, разделенных запятой.

2

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

Из опубликованной вами статьи:

if (Yii::$app->request->isPost) {
$model->imageFile = UploadedFile::getInstance($model, 'imageFile');
if ($model->upload()) {
// file is uploaded successfully
return;
}
}

Метод загрузки находится в первом блоке кода и сохраняет файл в файловой системе.

public function upload()
{
if ($this->validate()) {
$this->imageFile->saveAs('uploads/' . $this->imageFile->baseName . '.' . $this->imageFile->extension);
return true;
} else {
return false;
}
}

Если вы хотите сохранить его как двоичный файл в вашей базе данных, вам необходимо прочитать содержимое файла (например, file_get_contents) и назначьте его атрибуту модели.

0

Обратите внимание, что если вы используете стандартную ActiveForm, вы должны сообщить ей, что она ожидает несколько файлов, например:

echo $form->field($modelImage, 'imageFiles[]')->fileInput(['multiple' => true]);

скорее, чем:

echo $form->field($modelImage, 'imageFiles')->fileInput(['multiple' => true]);
0
По вопросам рекламы [email protected]