Загрузить файл из формы и скачать

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Загрузить файл из формы и скачать

Сообщение svil »

Задача: загрузить xls файл на сервер в папку web/upload чтобы потом пользователь мог скачать его.
Модель, контроллер, Crud из таблицы БД id, filename
По документации добавила use UploadFile
Ошибка

Код: Выделить всё

exception 'yii\base\UnknownMethodException' with message 'Calling unknown method: app\modules\admin\models\Xls::upload()' in /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/base/Component.php:300
Stack trace:
#0 /Users/svetlanailina/Sites/lema10/modules/admin/controllers/XlsController.php(73): yii\base\Component->__call('upload', Array)
#1 /Users/svetlanailina/Sites/lema10/modules/admin/controllers/XlsController.php(73): app\modules\admin\models\Xls->upload()
#2 [internal function]: app\modules\admin\controllers\XlsController->actionCreate()
#3 /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/base/InlineAction.php(57): call_user_func_array(Array, Array)
#4 /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/base/Controller.php(157): yii\base\InlineAction->runWithParams(Array)
#5 /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/base/Module.php(528): yii\base\Controller->runAction('create', Array)
#6 /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/web/Application.php(103): yii\base\Module->runAction('admin/xls/creat...', Array)
#7 /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/base/Application.php(386): yii\web\Application->handleRequest(Object(yii\web\Request))
#8 /Users/svetlanailina/Sites/lema10/web/index.php(18): yii\base\Application->run()
#9 {main}
Copy Stacktrace Search Stackoverflow Search Google Exception
Unknown Method – yii\base\UnknownMethodException
Calling unknown method: app\modules\admin\models\Xls::upload()
1. in /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/base/Component.php at line 300
291292293294295296297298299300301302303304305306307308309     */
    public function __call($name, $params)
    {
        $this->ensureBehaviors();
        foreach ($this->_behaviors as $object) {
            if ($object->hasMethod($name)) {
                return call_user_func_array([$object, $name], $params);
            }
        }
        throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
    }
 
    /**
     * This method is called after the object is created by cloning an existing one.
     * It removes all behaviors because they are attached to the old object.
     */
    public function __clone()
    {
        $this->_events = [];
2. in /Users/svetlanailina/Sites/lema10/modules/admin/controllers/XlsController.php at line 73 – yii\base\Component::__call('upload', [])
67686970717273747576777879    {
        $model = new Xls();
 
 
        if (Yii::$app->request->isPost) {
            $model->filename = UploadedFile::getInstance($model, 'filename');
            if ($model->upload()) {
                // file is uploaded successfully
                return;
            }
        }
        return $this->render('create', [
            'model' => $model,
3. in /Users/svetlanailina/Sites/lema10/modules/admin/controllers/XlsController.php at line 73 – app\modules\admin\models\Xls::upload()
67686970717273747576777879    {
        $model = new Xls();
 
 
        if (Yii::$app->request->isPost) {
            $model->filename = UploadedFile::getInstance($model, 'filename');
            if ($model->upload()) {
                // file is uploaded successfully
                return;
            }
        }
        return $this->render('create', [
            'model' => $model,
4. app\modules\admin\controllers\XlsController::actionCreate()
5. in /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/base/InlineAction.php at line 57 – call_user_func_array([app\modules\admin\controllers\XlsController, 'actionCreate'], [])
6. in /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/base/Controller.php at line 157 – yii\base\InlineAction::runWithParams([])
7. in /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/base/Module.php at line 528 – yii\base\Controller::runAction('create', [])
8. in /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/web/Application.php at line 103 – yii\base\Module::runAction('admin/xls/create', [])
9. in /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/base/Application.php at line 386 – yii\web\Application::handleRequest(yii\web\Request)
10. in /Users/svetlanailina/Sites/lema10/web/index.php at line 18 – yii\base\Application::run()
12131415161718require(__DIR__ . '/../vendor/yiisoft/yii2/Yii.php');
require __DIR__ . '/../functions.php';
 
$config = require(__DIR__ . '/../config/web.php');
 
 
(new yii\web\Application($config))->run();
 $_POST = [
    '_csrf' => 'MF1f2Q1mat9_kqQXVCjocqPVs-EgYHuPZAoM5C37JmMHFjnvewsvukmm4Ho-bp8dwp380WNNEcgzYWvRQ6lvFA==',
    'Xls' => [
        'filename' => '',
    ],
];

$_FILES = [
    'Xls' => [
        'name' => [
            'filename' => 'price2.xlsx',
        ],
        'type' => [
            'filename' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        ],
        'tmp_name' => [
            'filename' => '/private/var/tmp/phpxkwqK7',
        ],
        'error' => [
            'filename' => 0,
        ],
        'size' => [
            'filename' => 14107,
        ],
    ],
];

$_COOKIE = [
    '_identity' => 'cf22dc51a51f3622b87394b23f26dc65ac64648e10993a0c8bc5ca53dffd449da:2:{i:0;s:9:"_identity";i:1;s:28:"["100","test100key",2592000]";}',
    '_csrf' => '1655de35c4c7880982038480de9fac155994f0f90777192ca0ce4b0e5811038ca:2:{i:0;s:5:"_csrf";i:1;s:32:"7Kf6vmEe64DmjFwoaHO0C-jGWkg5nRIw";}',
    'PHPSESSID' => '24qcoe6m9k5hnrccsf6mk9rvb7',
    'dcjq-accordion' => '',
];

$_SESSION = [
    '__flash' => [],
    '__id' => '100',
    'elFinderCaches' => [
        '_optsMD5' => '7756f7eb42a5de125dd99780a622ecd1',
        'l1_' => [
            'rootstat' => [
                '8f88b6c88368f68cb5cd8dca45700799' => [
                    'isowner' => false,
                    'ts' => 1555579759,
                    'mime' => 'directory',
                    'read' => 1,
                    'write' => 1,
                    'size' => 0,
                    'hash' => 'l1_Lw',
                    'name' => 'Global',
                    'rootRev' => '',
                    'options' => [
                        'path' => '',
                        'url' => '/upload/global/',
                        'tmbUrl' => 'http://lema_work/assets/894972df/92e919de9b34fafeff997777697cf506/',
                        'disabled' => [
                            'chmod',
                        ],
                        'separator' => '/',
                        'copyOverwrite' => 1,
                        'uploadOverwrite' => 1,
                        'uploadMaxSize' => 9223372036854775807,
                        'uploadMaxConn' => 3,
                        'uploadMime' => [
                            'firstOrder' => 'deny',
                            'allow' => [],
                            'deny' => [],
                        ],
                        'dispInlineRegex' => '^(?:(?:video|audio)|image/(?!.+\\+xml)|application/(?:ogg|x-mpegURL|dash\\+xml)|(?:text/plain|application/pdf)$)',
                        'jpgQuality' => 100,
                        'archivers' => [
                            'create' => [
                                'application/x-tar',
                                'application/x-gzip',
                                'application/x-bzip2',
                                'application/x-xz',
                                'application/zip',
                            ],
                            'extract' => [
                                'application/x-tar',
                                'application/x-gzip',
                                'application/x-bzip2',
                                'application/x-xz',
                                'application/zip',
                            ],
                            'createext' => [
                                'application/x-tar' => 'tar',
                                'application/x-gzip' => 'tgz',
                                'application/x-bzip2' => 'tbz',
                                'application/x-xz' => 'xz',
                                'application/zip' => 'zip',
                            ],
                        ],
                        'uiCmdMap' => [],
                        'syncChkAsTs' => 1,
                        'syncMinMs' => 10000,
                        'i18nFolderName' => 0,
                        'tmbCrop' => 1,
                        'substituteImg' => true,
                        'onetimeUrl' => false,
                        'csscls' => 'elfinder-navbar-root-local',
                    ],
                    'volumeid' => 'l1_',
                    'locked' => 1,
                    'isroot' => 1,
                    'phash' => '',
                ],
            ],
            'subdirs' => [
                '/Users/svetlanailina/Sites/lema10/web/upload/global' => false,
            ],
        ],
        'archivers' => [
            'create' => [
                'application/x-tar' => [
                    'cmd' => 'tar',
                    'argc' => '-cf',
                    'ext' => 'tar',
                ],
                'application/x-gzip' => [
                    'cmd' => 'tar',
                    'argc' => '-czf',
                    'ext' => 'tgz',
                ],
                'application/x-bzip2' => [
                    'cmd' => 'tar',
                    'argc' => '-cjf',
                    'ext' => 'tbz',
                ],
                'application/x-xz' => [
                    'cmd' => 'tar',
                    'argc' => '-cJf',
                    'ext' => 'xz',
                ],
                'application/zip' => [
                    'cmd' => 'zip',
                    'argc' => '-r9 -q',
                    'ext' => 'zip',
                ],
            ],
            'extract' => [
                'application/x-tar' => [
                    'cmd' => 'tar',
                    'argc' => '-xf',
                    'ext' => 'tar',
                    'toSpec' => '-C ',
                ],
                'application/x-gzip' => [
                    'cmd' => 'tar',
                    'argc' => '-xzf',
                    'ext' => 'tgz',
                    'toSpec' => '-C ',
                ],
                'application/x-bzip2' => [
                    'cmd' => 'tar',
                    'argc' => '-xjf',
                    'ext' => 'tbz',
                    'toSpec' => '-C ',
                ],
                'application/x-xz' => [
                    'cmd' => 'tar',
                    'argc' => '-xJf',
                    'ext' => 'xz',
                    'toSpec' => '-C ',
                ],
                'application/zip' => [
                    'cmd' => 'unzip',
                    'argc' => '-q',
                    'ext' => 'zip',
                    'toSpec' => '-d ',
                ],
            ],
        ],
        'videoLib' => '',
        ':LAST_ACTIVITY' => 1555579774,
        'urlContentSaveIds' => [],
    ],
    'elFinderNetVolumes' => [],
];
Yii Framework
2019-04-18, 15:22:21

Apache/2.4.37 (Unix) PHP/5.6.38

Yii Framework/2.0.17

Yii 2.0.17 PHP 5.6.38 Status 500 Route admin/xls/create Log 29  1 Time 53 ms Memory 3.864 MB DB 2 4 ms Events 23 User 100

Модель

Код: Выделить всё

<?php

namespace app\modules\admin\models;

use Yii;

/**
 * This is the model class for table "xls".
 *
 * @property int $id
 * @property int $filename
 * @property int $extension
 */
class Xls extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    

    public static function tableName()
    {
        return 'xls';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['filename'], 'required'],

            [
                'filename',
                'file',
                'extensions' => 'xlsx, xls',
                'mimeTypes' =>
                    'application/zip, '
                    .'text/plain, '
                    .'application/x-dbf, '
                    .'application/vnd.ms-excel, '
                    .'application/vnd.oasis.opendocument.spreadsheet, '
                    .'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
                'checkExtensionByMimeType' => false
            ],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'filename' => 'Filename',

        ];
    }
}

Контроллер

Код: Выделить всё

<?php

namespace app\modules\admin\controllers;

use Yii;
use app\modules\admin\models\Xls;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use yii\web\UploadedFile;

/**
 * XlsController implements the CRUD actions for Xls model.
 */
class XlsController extends Controller
{
    /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['POST'],
                ],
            ],
        ];
    }

    /**
     * Lists all Xls models.
     * @return mixed
     */
    public function actionIndex()
    {
        $dataProvider = new ActiveDataProvider([
            'query' => Xls::find(),
        ]);

        return $this->render('index', [
            'dataProvider' => $dataProvider,
        ]);
    }

    /**
     * Displays a single Xls model.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionView($id)
    {
        return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
    }

    /**
     * Creates a new Xls model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new Xls();

        if (Yii::$app->request->isPost) {
            $model->filename = UploadedFile::getInstance($model, 'filename');
            if ($model->upload()) {
                // file is uploaded successfully
                return;
            }
        }
        return $this->render('create', [
            'model' => $model,
        ]);
    }

    /**
     * Updates an existing Xls model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        }

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

    /**
     * Deletes an existing Xls model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     * @throws NotFoundHttpException if the model cannot be found
     */
    public function actionDelete($id)
    {
        $this->findModel($id)->delete();

        return $this->redirect(['index']);
    }

    /**
     * Finds the Xls model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return Xls the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id)
    {
        if (($model = Xls::findOne($id)) !== null) {
            return $model;
        }

        throw new NotFoundHttpException('The requested page does not exist.');
    }
}

Вид

Код: Выделить всё

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;

/* @var $this yii\web\View */
/* @var $model app\modules\admin\models\Xls */
/* @var $form yii\widgets\ActiveForm */
?>

<div class="xls-form">

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

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



    <div class="form-group">
        <?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
    </div>

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

</div>
Последний раз редактировалось svil 2019.04.18, 17:42, всего редактировалось 1 раз.
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Загрузить файл из формы

Сообщение SiZE »

Это 100% рабочая дока https://www.yiiframework.com/doc/guide/ ... ile-upload
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: Загрузить файл из формы

Сообщение svil »

Переделала без БД
Работает
Но если загружаю 9 мб файл xlsx выдает ошибку

Код: Выделить всё

exception 'yii\web\BadRequestHttpException' with message 'Не удалось проверить переданные данные.' in /Users/svetlanailina/Sites/lema10/vendor/yiisoft/yii2/web/Controller.php:166
Stack trace:
Модель

Код: Выделить всё

<?php

namespace app\modules\admin\models;

use Yii;
use yii\base\Model;

class UploadForm extends Model
{

    public $file;

    public function rules()
    {
        return [
            // username and password are both required

            [['file'], 'file', 'extensions' => 'png, jpg, xls, xlsx',
                'skipOnEmpty' => false]];
    }

}
Контроллер

Код: Выделить всё

<?php


namespace app\modules\admin\controllers;
use Yii;
use yii\web\Controller;
use yii\web\UploadedFile;
use app\modules\admin\models\UploadForm;

class TestController extends Controller
{
    public function actionIndex()
    {
        //public $layout = 'photo';


        $model = new UploadForm();

        if (Yii::$app->request->post()) {
            $model->file = UploadedFile::getInstance($model, 'file');
            if ($model->validate()) {
                $path = Yii::$app->params['pathUploads'] . 'upload/';
                $model->file->saveAs($path . $model->file);
            }
        }
        return $this->render('index', ['model' => $model]);
    }

}
Вид

Код: Выделить всё

<?php
use yii\widgets\ActiveForm;
?>

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

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

<button>Submit</button>

<?php ActiveForm::end(); ?>
Аватара пользователя
svil
Сообщения: 563
Зарегистрирован: 2018.02.12, 22:41

Re: Загрузить файл из формы

Сообщение svil »

1 Загрузила на удаленный сервер, больше 10 минут загружался файл 9 мб xls. Значит у меня на локальном настройки такие.
Как сообщение вывести об успешной загрузке? Может виджет есть показывающий проценты загрузки ?
2 Загрузила я файл в папку web/upload, а скачивать его придется по конкретному имени из конкретной папки. А есть способ,
чтобы его скачать автоматически как-то? То есть пользователь загружает файл с любым именем xls xlsx и дальше его из меню при клике на кнопку можно скачать?
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Загрузить файл из формы и скачать

Сообщение SiZE »

1. Виджет есть, но это уже за пределами Й
2. Надо имя файла сохранить в базу и отдавать его пользователю по известному пути
Ответить