maxxtweek
@maxxtweek
Начинающий бекэнд разработчик

Как правильно загрузить файл на сервер и не получить 400 ошибку?

Всем привет.
Пытаюсь загрузить музыку на сервер .mp3

Модель
<?php
namespace app\models;
use Yii;
use yii\base\Model;
use yii\web\UploadedFile;

class MusicUpload extends Model{

    public $image;
    public function rules()
    {
        return [
            [['image'], 'required'],
//            [['image'], 'file', 'extensions' => 'jpg,png']
        ];
    }
    public function uploadFile(UploadedFile $file, $currentImage)
    {
        $this->image = $file;
        if($this->validate())
        {
            $this->deleteCurrentImage($currentImage);
            return $this->saveImage();
        }
    }
    private function getFolder()
    {
        return Yii::getAlias('@web') . 'uploads/musics/';
    }
    private function generateFilename()
    {
        return strtolower(md5(uniqid($this->image->baseName)) . '.' . $this->image->extension);
    }
    public function deleteCurrentImage($currentImage)
    {
        if($this->fileExists($currentImage))
        {
            unlink($this->getFolder() . $currentImage);
        }
    }
    public function fileExists($currentImage)
    {
        if(!empty($currentImage) && $currentImage != null)
        {
            return file_exists($this->getFolder() . $currentImage);
        }
    }
    public function saveImage()
    {
        $filename = $this->generateFilename();
        $this->image->saveAs($this->getFolder() . $filename);
        return $filename;
    }
}


Метод из MusicController
public function actionSetFile($id)
    {
        $model = new MusicUpload();
        if (Yii::$app->request->isPost)
        {
            $article = $this->findModel($id);

            $file = UploadedFile::getInstance($model, 'image');

            if($article->saveFile($model->uploadFile($file, $article->path)))
            {
                return $this->redirect(['view', 'id'=>$article->id]);
            }
        }

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


Модель Music
public function saveFile($filename)
    {
        $this->path = $filename;
        return $this->save(false);
    }


Сама форма
<?php $form = ActiveForm::begin(); ?>

    <?= $form->field($model, 'image')->fileInput() ?>
    <div class="form-group">
        <?= Html::submitButton('Загрузить', ['class' => 'btn btn-success']) ?>
    </div>

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

Попытался в контроллере, после проверки Yii::$app->request->isPost вывести, что приходит на сервер, но сразу выплевывает 400 ошибку...
Гугл подсказал, что возможно проблема в csrf токенах, но в форме он присутствует.
На локалке такой ошибки нет.
Благодарю за помощь :)
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
maxxtweek
@maxxtweek Автор вопроса
Начинающий бекэнд разработчик
Все оказалось довольно просто - в настройках php нужно было увеличить вес загружаемого файла :)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@Mysterion
Замените:
[['image'], 'required'],
на:
['image', 'file', 'extensions' => ['mp3']],
В валидаторе.
Ну и, желательно, имя image заменить на более подходящее
Вы пытаетесь файл под видом картинки загрузить и валидатор проверяет картинка это или нет.
Ответ написан
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
Гугл подсказал, что возможно проблема в csrf токенах

Так и есть, включите debug панель и смотрите что там и проверьте какой токен приходит и какой ожидается. Очистите кеш и сессии.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы