Проблемы с кодировкой при загрузке файла с формы

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Nabijon
Сообщения: 11
Зарегистрирован: 2015.11.03, 09:40

Проблемы с кодировкой при загрузке файла с формы

Сообщение Nabijon »

Привет, народ!
У меня такая проблемка: есть форма загрузки файла, все работает хорошо вот только если имена файлов на русском то сохраняется как "Как Р±С‹ РІ этом королевстве.jpg" вот код контроллера:

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

if($mbooks->load(Yii::$app->request->post() ) && $mbooks->validate()){
            $mbooks->file=UploadedFile::getInstance($mbooks,'file');
            print_r($mbooks->file);
            $name_file = iconv('UTF-8', 'utf-8//IGNORE', $mbooks->file->baseName);
            $mbooks->file->saveAs('files/'.$name_file.".".$mbooks->file->extension);
искал по форумам , проверил пару приемов, не помогло. кирилица на сранице отображается без проблем, кодировка php файлов utf8 without BOM.
А может есть пример транслита с кирилицы на латин как у ЧПУ
Буду признателен любой помощи
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение futbolim »

Кодировка названия файла utf ?
Аватара пользователя
Takun
Сообщения: 47
Зарегистрирован: 2015.04.22, 17:02

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Takun »

charset и сам файл в utf-8?Просто у меня было такое, что мой редактор автоматом сохранял в windows-1251 :)
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение ElisDN »

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

Inflector::slug(pathinfo($file->name, PATHINFO_FILENAME)) . '.' . $file->extension; 
Nabijon
Сообщения: 11
Зарегистрирован: 2015.11.03, 09:40

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Nabijon »

Везде кодировка стоит utf 8 without BOM
Nabijon
Сообщения: 11
Зарегистрирован: 2015.11.03, 09:40

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Nabijon »

Inflector - для транслита да? Спасибо большое помогло
Nabijon
Сообщения: 11
Зарегистрирован: 2015.11.03, 09:40

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Nabijon »

Еще одно: Я сгенерировал модели с помощю gii? далее я обявил все поля таблицы как свойства этого ж класса, теперь когда я хочу что то из базы запросить, он возвращает массив в котором привидены все свойства класса и потом та информация которую я запращивал.

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

    object(app\models\Books)[60]
  public 'book_id' => null
  public 'book_name' => null
  public 'author_id' => null
  public 'rubrika_id' => null
  public 'page_count' => null
  public 'anotation' => null
  public 'file' => null
  public 'filepath' => null
  public 'image' => null
  public 'imagepath' => null
  public 'who_added' => null
  public 'created' => null
  private '_attributes' (yii\db\BaseActiveRecord) => 
    array (size=10)
      'book_id' => int 1
      'book_name' => string 'zzx' (length=3)
      'author_id' => int 1
      'rubrika_id' => int 1
      'page_count' => int 444
      'ezoh' => string 'fdsg' (length=4)
      'filepath' => string 'files/1.rar' (length=11)
      'imagepath' => null
      'who_added' => int 1
      'created' => string '2015-08-05 00:00:00' (length=19)
  private '_oldAttributes' (yii\db\BaseActiveRecord) => 
    array (size=10)
      'book_id' => int 1
      'book_name' => string 'zzx' (length=3)
      'author_id' => int 1
      'rubrika_id' => int 1
      'page_count' => int 444
      'ezoh' => string 'fdsg' (length=4)
      'filepath' => string 'files/1.rar' (length=11)
      'imagepath' => null
      'who_added' => int 1
      'created' => string '2015-08-05 00:00:00' (length=19)
  private '_related' (yii\db\BaseActiveRecord) => 
    array (size=0)
      empty
  private '_errors' (yii\base\Model) => null
  private '_validators' (yii\base\Model) => null
  private '_scenario' (yii\base\Model) => string 'default' (length=7)
  private '_events' (yii\base\Component) => 
    array (size=0)
      empty
  private '_behaviors' (yii\base\Component) => 
    array (size=0)
      empty
 

Когда я закоментировал все свойства класса, тогда все нормально заработало. Как быть с проверкой формы если не будет свойств в модели
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Onotole »

Не нужно объявлять свойства модели. Они будут автоматически объявлены через метод __get()
Nabijon
Сообщения: 11
Зарегистрирован: 2015.11.03, 09:40

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Nabijon »

значить я могу даже без свойств класса проверять эти "свойства" в rules() ? в моей ситуации в таблице бд ест поле filepath, для проверки самого файла на валидность я должен добавить свойство file в модел?
Nabijon
Сообщения: 11
Зарегистрирован: 2015.11.03, 09:40

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Nabijon »

Nabijon писал(а):значить я могу даже без свойств класса проверять эти "свойства" в rules() ? в моей ситуации в таблице бд ест поле filepath, для проверки самого файла на валидность я должен добавить свойство file в модел?
так все и оказалось, так и сделал и получилось как я предполагал... Спасибо всем за помощ
Kven
Сообщения: 112
Зарегистрирован: 2016.10.20, 23:03

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Kven »

Всем здравствуйте! Столкнулся с схожей проблемой, что была описана автором темы, применил в качестве решения Inflector, но теперь другая проблема, при загрузке файла где имя указано на английском языке все нормально, файл имеет название "file.pdf", а вот при загрузке файла имя которого на русском языке, получается файл загружается без названия, и имеет только расширение " .pdf". Помогите пожалуйста разобраться.

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

public function upload()
{
    if ($this->validate()) {
        $this->docFile->saveAs('upload/' . (Inflector::slug(pathinfo($this->docFile->baseName, PATHINFO_FILENAME))) . '.' . $this->docFile->extension);
        return true;
    } else {
        return false;
    }
}
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Dominus »

Как то так, для русских названий делать транслитерацию

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

public function upload()
{
    if ($this->validate()) {
        $this->docFile->saveAs('upload/' . (Inflector::slug(pathinfo($this->str2url($this->docFile->baseName), PATHINFO_FILENAME))) . '.' . $this->docFile->extension);
        return true;
    } else {
        return false;
    }
}


public function rus2translit($string) {
    $converter = array(
        'а' => 'a',   'б' => 'b',   'в' => 'v',
        'г' => 'g',   'д' => 'd',   'е' => 'e',
        'ё' => 'e',   'ж' => 'zh',  'з' => 'z',
        'и' => 'i',   'й' => 'y',   'к' => 'k',
        'л' => 'l',   'м' => 'm',   'н' => 'n',
        'о' => 'o',   'п' => 'p',   'р' => 'r',
        'с' => 's',   'т' => 't',   'у' => 'u',
        'ф' => 'f',   'х' => 'h',   'ц' => 'c',
        'ч' => 'ch',  'ш' => 'sh',  'щ' => 'sch',
        'ь' => '\'',  'ы' => 'y',   'ъ' => '\'',
        'э' => 'e',   'ю' => 'yu',  'я' => 'ya',
        
        'А' => 'A',   'Б' => 'B',   'В' => 'V',
        'Г' => 'G',   'Д' => 'D',   'Е' => 'E',
        'Ё' => 'E',   'Ж' => 'Zh',  'З' => 'Z',
        'И' => 'I',   'Й' => 'Y',   'К' => 'K',
        'Л' => 'L',   'М' => 'M',   'Н' => 'N',
        'О' => 'O',   'П' => 'P',   'Р' => 'R',
        'С' => 'S',   'Т' => 'T',   'У' => 'U',
        'Ф' => 'F',   'Х' => 'H',   'Ц' => 'C',
        'Ч' => 'Ch',  'Ш' => 'Sh',  'Щ' => 'Sch',
        'Ь' => '\'',  'Ы' => 'Y',   'Ъ' => '\'',
        'Э' => 'E',   'Ю' => 'Yu',  'Я' => 'Ya',
    );
    return strtr($string, $converter);
}

public function str2url($str) {
    // переводим в транслит
    $str = rus2translit($str);
    // в нижний регистр
    $str = strtolower($str);
    // заменям все ненужное нам на "-"
    $str = preg_replace('~[^-a-z0-9_]+~u', '-', $str);
    // удаляем начальные и конечные '-'
    $str = trim($str, "-");
    return $str;
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Kven
Сообщения: 112
Зарегистрирован: 2016.10.20, 23:03

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Kven »

Не знаю почему, но выдает ошибку

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

Call to undefined function app\models\rus2translit()
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Dominus »

Kven писал(а): 2017.08.25, 20:01 Не знаю почему, но выдает ошибку

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

Call to undefined function app\models\rus2translit()

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

public function str2url($str) {
    // переводим в транслит
    $str = $this->rus2translit($str);
    // в нижний регистр
    $str = strtolower($str);
    // заменям все ненужное нам на "-"
    $str = preg_replace('~[^-a-z0-9_]+~u', '-', $str);
    // удаляем начальные и конечные '-'
    $str = trim($str, "-");
    return $str;
}
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Kven
Сообщения: 112
Зарегистрирован: 2016.10.20, 23:03

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Kven »

Благодарю за оказанную помощь!
Подскажите еще пожалуйста, может подобный вопрос уже поднимался на форуме, либо есть какие-нибудь материалы, которые смогут дать ответ на вопрос. Вопросы следующие:
1. Как при загрузке файла на сервер, сделать запись в БД с содержащим путем к файлу?
2. Как сделать, чтобы при загрузке файла на сервер, в директории upload автоматически создавалась директории с id, либо датой загрузки документа?
Аватара пользователя
Dominus
Сообщения: 892
Зарегистрирован: 2013.03.14, 21:27
Откуда: Россия, Иваново
Контактная информация:

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Dominus »

Kven писал(а): 2017.08.25, 23:16 Благодарю за оказанную помощь!
Подскажите еще пожалуйста, может подобный вопрос уже поднимался на форуме, либо есть какие-нибудь материалы, которые смогут дать ответ на вопрос. Вопросы следующие:
1. Как при загрузке файла на сервер, сделать запись в БД с содержащим путем к файлу?
2. Как сделать, чтобы при загрузке файла на сервер, в директории upload автоматически создавалась директории с id, либо датой загрузки документа?
Возможные варианты
1. Возвращать путь после загрузки файла и записывать его в БД;
2. Перед загрузкой файла, проверять существование нужной директории и если её нет, создать;

Пример 1
UploadForm.php

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

public $path = 'upload/';
//...
public function upload()
{
    if ($this->validate()) {
        $this->docFile->saveAs($this->path . (Inflector::slug(pathinfo($this->str2url($this->docFile->baseName), PATHINFO_FILENAME))) . '.' . $this->docFile->extension);
        return $this->path;
    } else {
        return false;
    }
}
Пример 2
UploadForm.php

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

public $path = 'upload/';
public $dirName = '';
//...
public function upload()
{    
    if ($this->validate()) {
        $path = $this->processMkDir();
        $this->docFile->saveAs($path . (Inflector::slug(pathinfo($this->str2url($this->docFile->baseName), PATHINFO_FILENAME))) . '.' . $this->docFile->extension);
        return $path;
    } else {
        return false;
    }
}

protected function processMkDir()
    {
        $path = (!empty($this->dirName)) ? $this->path.$this->dirName.'/' : $this->path;
        if (!file_exists($path)) {
            mkdir($path, 0777, true);
        }
        return $path;
    }
В контроллере при создании модели загрузки, передавать имя папки

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

$uploadModel = new UploadForm([
  'dirName' => 'user_'.Yii::$app->user->identity->getId(), // Папка будет называться user_<идентификатор_текущего_пользователя>.
]);
После загрузки получаем путь и сохраняем в базу

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

//...
if ($model->path = $uploadModel->upload()) {
  $model->save();
}
//...
Не спорь с дураком, иначе окружающие не правильно поймут кто из вас дурак!
Kven
Сообщения: 112
Зарегистрирован: 2016.10.20, 23:03

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Kven »

Спасибо за информацию, буду пробовать.
Kven
Сообщения: 112
Зарегистрирован: 2016.10.20, 23:03

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Kven »

Здравствуйте! Вопрос может для многих будет банальным, но очень прошу помощи. Использовал я способ описанный в посте выше, в принципе все работает отлично - создается директория, в нее загружается файл из формы, но вот я ни как не могу записать в БД путь к файлу. Как я только не пытался прописать в функции actionCreate следующие строки, ничего у меня не выходит.

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

После загрузки получаем путь и сохраняем в базу
//...
if ($model->path = $model->upload()) {
  $model->save();
}
//...
Функция добавления документа

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

public function actionCreate()
    {
        $model = new Document([
          'dirName' =>'user_'.Yii::$app->user->identity->getId(),
        ]);

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

            $model->docFile = UploadedFile::getInstance($model, 'docFile');
            if($model->docFile){
                $model->upload();
            }
            unset($model->docFile);

            Yii::$app->session->setFlash('success', "Документ {$model->name} добавлен");

            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('create', [
                'model' => $model,
            ]);
        }
    }
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение ElisDN »

Ну так вызывайте save() после upload(), а не до.
Kven
Сообщения: 112
Зарегистрирован: 2016.10.20, 23:03

Re: Проблемы с кодировкой при загрузке файла с формы

Сообщение Kven »

Выходит ошибка

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

finfo_file(D:\OpenServer\userdata\temp\php9A95.tmp): failed to open stream: No such file or directory
Директория все также создается в таком случае и файл в нее загружается
Ответить