Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Не отображаются файлы с русскими именами
 
 автор: Василий   (05.01.2012 в 20:32)   письмо автору
 
 

Стоит загрузить логотип, названный русскими буквами, то логотип не отображается.
Загрузка логотипа:</b></td><td><input type='file' name='userfile'>";

Есть ли возможность решить эту проблему?

  Ответить  
 
 автор: Slo_Nik   (05.01.2012 в 20:34)   письмо автору
 
   для: Василий   (05.01.2012 в 20:32)
 

Да, при загрузке переименовывать файл

  Ответить  
 
 автор: cheops   (05.01.2012 в 20:36)   письмо автору
 
   для: Василий   (05.01.2012 в 20:32)
 

А вы как его сохраняете на диск, прямо с русским названием? Если да, то лучше отказаться от этой идеи, так как UNIX-системы на серверах плохо поддерживают файлы с русскими названиями, но даже если они поддерживают их хорошо, у вас будут постоянные проблемы с такими файлами при ссылке на них из HTML-кода, так как русские символы недопустимы.

Лучше при загрузки файла в имени которого есть русские символы, переименовывать его, используя транслит. Возможно вас заинтересует скрипт по ссылке http://softtime.ru/scripts/translit.php.

  Ответить  
 
 автор: Василий   (05.01.2012 в 20:43)   письмо автору
 
   для: cheops   (05.01.2012 в 20:36)
 

так пользователь не знает об этом.
как предугадать что он загрузит свой логотип, названный русскими буквами?

  Ответить  
 
 автор: cheops   (05.01.2012 в 20:48)   письмо автору
 
   для: Василий   (05.01.2012 в 20:43)
 

Не надо предугадывать, просто пропускайте все имена файлов через функцию транслита, если там только английские символы - ничего не произойдет, если часть из них русские - они будут заменены на английские. Понятно, что операцию с именем файла нужно осуществлять до того, как вы будете копировать файл из временной директорию в постоянную при помощи функции copy() или move_uploaded_file().

  Ответить  
 
 автор: Василий   (05.01.2012 в 21:23)   письмо автору
 
   для: cheops   (05.01.2012 в 20:48)
 

 if ($_FILES['userfile']['error'] === UPLOAD_ERR_OK)  
        {  
            // проверяем расширение файла  
            $file_extension = pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION);  
            if (in_array($file_extension, $valid_extensions))  
            {  
                // проверяем размер файла  
                if ($_FILES['userfile']['size'] < $max_file_size)  
                {  
тут вставляем новую  функцию

function encodestring($st)
  {
    // Сначала заменяем "односимвольные" фонемы.
    $st=strtr($st,"абвгдеёзийклмнопрстуфхъыэ_",
    "abvgdeeziyklmnoprstufh'iei");
    $st=strtr($st,"АБВГДЕЁЗИЙКЛМНОПРСТУФХЪЫЭ_",
    "ABVGDEEZIYKLMNOPRSTUFH'IEI");
    // Затем - "многосимвольные".
    $st=strtr($st, 
                    array(
                        "ж"=>"zh", "ц"=>"ts", "ч"=>"ch", "ш"=>"sh", 
                        "щ"=>"shch","ь"=>"", "ю"=>"yu", "я"=>"ya",
                        "Ж"=>"ZH", "Ц"=>"TS", "Ч"=>"CH", "Ш"=>"SH", 
                        "Щ"=>"SHCH","Ь"=>"", "Ю"=>"YU", "Я"=>"YA",
                        "ї"=>"i", "Ї"=>"Yi", "є"=>"ie", "Є"=>"Ye"
                        )
             );
    // Возвращаем результат.
    return $st;
  }

Далее записываем 
                $destination ="img/logo_pu/" . $_FILES['userfile']['name']; 

ПРавильно?

  Ответить  
 
 автор: Slo_Nik   (05.01.2012 в 21:33)   письмо автору
 
   для: Василий   (05.01.2012 в 21:23)
 

а Вы запустите свой код и посмотрите, будет он работать или нет, вот тогда и решите, правильно или нет.

  Ответить  
 
 автор: Василий   (05.01.2012 в 21:42)   письмо автору
 
   для: Slo_Nik   (05.01.2012 в 21:33)
 

ошибок нет и файл не переименовывается

  Ответить  
 
 автор: cheops   (05.01.2012 в 21:45)   письмо автору
 
   для: Василий   (05.01.2012 в 21:23)
 

Нет не правильно, у вас есть определение функции, но нет её вызова с передайте её имени файла.

  Ответить  
 
 автор: Василий   (05.01.2012 в 21:53)   письмо автору
 
   для: cheops   (05.01.2012 в 21:45)
 

вот так
encodestring ($destination ="img/logo_pu/" . $_FILES['userfile']['name'];

  Ответить  
 
 автор: cheops   (05.01.2012 в 22:03)   письмо автору
 
   для: Василий   (05.01.2012 в 21:53)
 

Видите внутри функции есть строчка
    // Возвращаем результат. 
    return $st;
это означает, что функция возвращает результат и её вызов должен выглядеть следующим образом
$_FILES['userfile']['name'] = encodestring ($_FILES['userfile']['name']);
а после этого уже можно формировать переменную $destination.

  Ответить  
 
 автор: Василий   (05.01.2012 в 22:18)   письмо автору
 
   для: cheops   (05.01.2012 в 22:03)
 

картинка переименовывается.
и не только )
сама картинка меняется. принскрин FlashFXP осущетствляется.
Что делать?

  Ответить  
 
 автор: Василий   (05.01.2012 в 22:44)   письмо автору
 
   для: Василий   (05.01.2012 в 22:18)
 

$_FILES['userfile']['name'] = encodestring ($_FILES['userfile']['name']);
                
$destination ="img/logo_pu/" . $_FILES['userfile']['name']; 
      
 if (move_uploaded_file($_FILES['userfile']['tmp_name'], $destination))  

  Ответить  
 
 автор: Василий   (05.01.2012 в 23:04)   письмо автору
 
   для: Василий   (05.01.2012 в 22:44)
 

может двойные скобки нужны?
$_FILES['userfile']['name'] = encodestring(($_FILES['userfile']['name']));

  Ответить  
 
 автор: Василий   (06.01.2012 в 00:28)   письмо автору
 
   для: Василий   (05.01.2012 в 23:04)
 

Тишина )

  Ответить  
 
 автор: cheops   (06.01.2012 в 00:51)   письмо автору
 
   для: Василий   (06.01.2012 в 00:28)
 

Функция ничего с содержимым не делает, если же работоспособность файла зависит от его названия, тут ничего не поделаешь, придется не переименовывать и работать с русскими названиями. Тогда применяйте функцию urlencode() для кодирования имени уже при выводе имени в тэге <img> и или при формировании пути к флеш-ролику, если речь идет о нем.

  Ответить  
 
 автор: Василий   (06.01.2012 в 00:59)   письмо автору
 
   для: cheops   (06.01.2012 в 00:51)
 

речь идет о том, что когда грузится jpg файл с русским названием, то он переименовывается на английские буквы, но и при этом картинка перезапивается - вместо логотипа появляется скрин программы.
Если же загружаемый файл с англ буквами - проблем нет

  Ответить  
 
 автор: Василий   (06.01.2012 в 09:17)   письмо автору
 
   для: Василий   (06.01.2012 в 00:59)
 

так что подскажите?

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 14:48)   письмо автору
 
   для: Василий   (06.01.2012 в 09:17)
 

Какой программы скрин появляется?

  Ответить  
 
 автор: Василий   (06.01.2012 в 15:22)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 14:48)
 

FlashFXP - программа, которая кидает файлы на сервер

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 15:52)   письмо автору
 
   для: Василий   (06.01.2012 в 15:22)
 

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

<?php 
$ext 
strtolower(strstr($_FILES['filename']['name'], '.'));
$newname date("YmdHis"time()).$ext;
/* под таким именем и загружаете */

А откуда берётся скрин программы?

  Ответить  
 
 автор: Василий   (06.01.2012 в 15:56)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 15:52)
 

А откуда берётся скрин программы?
он вместо картинки. Грузили логотип - получили картинку той программы
можно избежать использования функции по изменению названия файла на транслит если Вы будете сами, не смотря на то, какое имя у оригинала менять имя файла.самому то зачем - все для пользователя делается

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 15:58)   письмо автору
 
   для: Василий   (06.01.2012 в 15:56)
 

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

  Ответить  
 
 автор: Василий   (06.01.2012 в 16:14)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 15:58)
 

                $_FILES['userfile']['name'] = encodestring ($_FILES['userfile']['name']);
                
                
                $destination ="img/logo_pu/" . $_FILES['userfile']['name']; 


если убрать верхнюю строку, то чудес и не будет.
Эта функция транслятор все портит

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 16:20)   письмо автору
 
   для: Василий   (06.01.2012 в 16:14)
 

сама функция не может влиять на загружаемый файл, разве, что только на его имя.
давайте оба файла показывайте, с формой и обработчиком
НО!!! Упакуйте эти файлы в архив и прикрепите к своему сообщению

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 16:19)   письмо автору
 
   для: Василий   (06.01.2012 в 15:56)
 

да не может скрин программы взяться из воздуха!!!
самому то зачем - все для пользователя делается
что именно? имя файла? если сделать так, как я писал, то не будет проблемы с кириллическими символами. и не нужна будет лишняя функция в коде.

  Ответить  
 
 автор: Василий   (06.01.2012 в 16:49)   письмо автору
 
   для: Slo_Nik   (06.01.2012 в 16:19)
 

значит функцию транслита долой?
ставим это?
<?php 
$ext 
strtolower(strstr($_FILES['filename']['name'], '.'));
$newname date("YmdHis"time()).$ext;
/* под таким именем и загружаете */ 

  Ответить  
 
 автор: Slo_Nik   (06.01.2012 в 17:13)   письмо автору
 
   для: Василий   (06.01.2012 в 16:49)
 

Это только Вам решать, мне ни чего не надо ставить ни в какой код....
Но я бы на Вашем месте разобрался бы ещё и с функцией....

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования