Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Аплоад файлов с не английским именем


Автор: infarch 19.9.2012, 14:25
Возникла некая странность у меня. 
Есть форма, в упрощенном виде вот такая:

Код

<html>
  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  </head>
  <body>
    <form method="post" name="data" action="/controller" enctype="multipart/form-data" accept-charset="UTF-8">

      <input type="file" name="file_1" />
      <input type="text" name="subject_1" />

      <input type="submit" value="Ok" />

    </form>
  </body>
</html>


Данные с нее принимает перл скрипт работающий под apache+mod_perl.

Код


use strict;

binmode( STDOUT, ':encoding(utf8)' );

use CGI ();
CGI->compile(':all');

my $cgi = $cgi->new();

request_log($cgi); # реквестлог просто пишет все что пришло в базу

...



Я выбираю файл с именем "картиночка 日本国.jpg" и ввожу сабжект по русски. После сабмита в логе вижу:

[file_1 = картиночка 日本国.PNG]
[subject_1 = комент]

Ожидаемо smile ... Добавляю поддержку ютф8 к CGI: CGI->compile(':all', ':utf8'); и теперь уже в логе кое-что получше:

[file_1 = картиночка 日本国.PNG]
[subject_1 = комент]

Теперь cgi->param для сабжекта возвращает раскодированную строку. А вот для имени файла - нет. И собственно вопрос: нельзя ли научить модуль делать и это тоже? Я конечно могу перед сабмитом взять жаваскриптом это имя и просто кинуть его в хиден инпут. Но формочек у меня много, даже нет - МНОГО. Да и в логах лишняя запись будет, а это не очень хорошо при высокой нагрузке. В общем, прошу посоветовать разумный выход...


Автор: infarch 21.9.2012, 09:59
Изучил код модуля CGI и понял что нет там такой настройки :( Пришлось переписать логгер, научить отличать строку от хендлера. И сам обработчик аплоада у меня вынесен в отдельную универсальную функцию, добавил decode. Так что закрываю тему.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)