Xpoint
   [напомнить пароль]

File Upload + русские буквы в имени

Метки: [без меток]
2006-09-20 18:51:37 [обр] kird[досье]

Аплоад для файлов с латинскими именами проходит хорошо,
я так понимаю, что параметр пришедший с формы пользователя типа file является строкой(путь к файлу на локальном компьютере) и дискриптором... на некоторых серверах работает загрузка файла с русскими буквами в пути, на моем нет...

пример:
отправляю C:\фыва.ppt
в скрипте

my $ClientFilePath=$query->param('file_d');
die "\n\n-----------------\n".$ClientFilePath;

в логе

-----------------
asdf

asdf это содержимое файла фыва.ppt

Из-за чего это может быть, как добраться до имени файла?
Спасибо

спустя 21 минуту [обр] Алексей Севрюков(198/1280)[досье]

kird[досье] Посмотрел исходник, там ничего похожего нет. Попробуйте посмотреть так:

my $file=$query->param('file_d');
my %h=$file->readHeader();
while(my($k,$v)=each(%h))
 {
  print "$k = $v<br>";
 }

и отпишите, поможет или нет. Если не поможет - покажите версию Вашего CGI:

use CGI;
print $CGI::VERSION;
спустя 28 минут [обр] kird[досье]
Can't locate object method "readHeader" via package "asdf"
$CGI::VERSION 3.05
Возможно дело в нем
спустя 1 час 19 минут [обр] Алексей Севрюков(198/1280)[досье]
kird[досье] Нет, дело не в этом, возможно я сам ошибся. param возвращает не ссылку на объект, а содержимое файла, я завтра покопаюсь еще в исходниках.
спустя 19 часов [обр] Алексей Севрюков(198/1280)[досье]
сообщение промодерировано
Нашел еще два метода: upload и uploadInfo, полагаю Вам нужен второй.
Т.е.:
my $fileInfo=$query->uploadInfo('file_d');
спустя 20 дней [обр] Bohdan[досье]

В своём upload'ере сделал так:

<form method="post" enctype="multipart/form-data" action="/post.cgi"><br />
<input type="file" name="file"><br />
<input type="submit" name="Submit" value="Send"><br />
</form>
$CGI::POST_MAX = 10240;
routine() if (param());
sub routine {
   my $downpath = "F:/tmp/";
   my $in=param('file');
   my ($name) = $in =~ m#([^\\/:]+)$#;
   open(OUT,">$downpath$wname");
   binmode(OUT);
   while (<$in>) {
      print OUT $_;
   }
   close(OUT);

Пример откуда-то взял, вот откуда - не помню. Как собсно происходит выборка имени, я так и не понял (где - понятно, как - нет), но работает - и ладно. Нормально пишет и латинские, и кирилицу.

PS. ОСь WinXP

спустя 2 часа 15 минут [обр] Алексей Севрюков(198/1280)[досье]
Bohdan[досье] Ваш пример не полный. И потом, к чему он здесь?
спустя 17 минут [обр] Bohdan[досье]
Насколько я понял, проблема в получении корректного имени файла если имя содержит нелатинские буквы. Или я неправильно понял?
Минимальный код примера был указан чтобы показать где именно и как происходит процесс получения имени файла.
Тем не менее, если Вы считаете, что этого не достаточно, минимальный готовый рабочий код (файл /cgi-bin/upload.cgi):
#!perl -w
use CGI qw/:standard/; 
use CGI::Carp qw(fatalsToBrowser);

# Код для HTML-формы 
print "Content-Type: text/html\n\n"; 
print qq{<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>Upload</title>
<link rel="stylesheet" type="text/css" href="/css/upload.css">
</head>
<body>
<center>
<form method="post" enctype="multipart/form-data" action="/cgi-bin/upload.cgi"><br>
<input type="file" name="file"><br>
<input type="submit" name="Submit" value="Send">
</form>
</body>
</html>
};

insert_file() if (param()); 

sub insert_file {
  # путь к директории для закачки
  my $downpath = "F:/tmp"; 
  my $in=param('file'); 

  # выделяем имя файла из параметра 
  my ($name) = $in =~ m#([^\\/:]+)$#; 
  open(OUT,">$downpath$name"); 
  binmode(OUT); 
  # читаем входной поток и пишем в файл 
  while (<$in>) { 
    print OUT $_; 
  } 
  close(OUT); 

  # выводим надпись о закачке файла
  print "Uploaded file: $name"; 
}
спустя 1 минуту [обр] Bohdan[досье]

Ах, поправочка, на 27 строке вместо

my $downpath = "F:/tmp";

должно быть

my $downpath = "F:/tmp/";
спустя 2 часа 41 минуту [обр] Алексей Севрюков(198/1280)[досье]
Bohdan[досье] Прочитайте пожалуйста первый пост, посмотрите пример и вникните. У автора при использовании param - возвращается не имя файла, а его содержимое.
спустя 1 час 13 минут [обр] Bohdan[досье]

Алексей Севрюков[досье] Просмотрите пожалуйта предложенный скрипт, и обратите внимание на 31-ю строчку кода.

 my ($name) = $in =~ m#([^\\/:]+)$#;

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

Powered by POEM™ Engine Copyright © 2002-2005