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


Автор: mad_doc 11.5.2005, 02:29
Помогите разобраться с такой проблемой, из БД грузятся ссылки на разные файлы (.doc, .xls, pdf, chm ........)
Все это отображается в броузере ИЕ на странице .cgi

Выдает 500 ошибку, в логе
[Wed May 11 02:00:32 2005] [error] [client 127.0.0.1] /home/site/cgi-bin/materials/p1010876.jpg is not executable; ensure interpreted scripts have "#!" first line
[Wed May 11 02:00:32 2005] [error] [client 127.0.0.1] (2)No such file or directory: couldn't spawn child process: /home/site/cgi-bin/materials/p1010876.jpg

Автор: CPLUSPLUS 11.5.2005, 05:03
Нужен код....

Автор: korob2001 11.5.2005, 06:10
Цитата

[Wed May 11 02:00:32 2005] [error] [client 127.0.0.1] /home/site/cgi-bin/materials/p1010876.jpg is not executable; ensure interpreted scripts have "#!" first line
[Wed May 11 02:00:32 2005] [error] [client 127.0.0.1] (2)No such file or directory: couldn't spawn child process: /home/site/cgi-bin/materials/p1010876.jpg

Наверное у тебя графический файл лежит в рабочем каталоге, вот он и говорит тебе о том, что не может запустить файл на выполнение, так как в нём, в первой строке не указан путь к Perl интерпретатору, потому как его там и не должно быть. Вобщем вынеси все файлы .xls, .pdf, .jpg, .gif и т.д. из каталога /cgi-bin, затем измени пути к ним в БД.

Удачи.

Автор: Guest 11.5.2005, 13:14
Спасибо, но после перенесения в другую папку запускаются только картинки, да и то, только в текущем окне?

Автор: mad_doc 11.5.2005, 13:15
это сверху я был

Автор: korob2001 11.5.2005, 15:58
А что значит запускается???? Покажи часть кода, где ты запускаешь один из этих файлов.

Автор: Guest 11.5.2005, 16:02
Код как код <a href=$data_path$arc[5] target=_blank>Файл</a>

Автор: korob2001 11.5.2005, 16:25
Вообще-то всё верно и не может быть, что бы такая ссылка открывала документ в текущем окне. Скорее всего скорее всего проблема в путях. Попробуй создай в корне ( рядом с /cgi-bin ), каталог /files, т.е. у тебя должна получиться такая структура:

Код

корень__
        |
        /cgi-bin/_
        |         |
        |         рабочие файлы .pl .cgi
        |         рабочие файлы .pl .cgi
        |
        /files/_
                |
                файлы .doc, .pdf, .jpg и т.д.

Теперь измени значения переменных:
Код

$data_path = "/files/";
$arc[5] = "имя файла.pdf";

Насколько я понял, то елеменит массива $arc[5] инициализируется из БД, если да и в БД указанны только имена файлов, то ничего менять не нужно.

И последнее, захвати весь генерируемый путь в двойные кавычки и выдели имена пременных фигурными скобками, так будет более наглядно:
Код

<a href="${data_path}${arc[5]}" target="_blank">

Просто если у тебя в пути будет присутствовать хоть один пробел, то браузер тебя может не понять, если путь не будет захвачен в кавычки.

Если все вышесказанное не поможет, то попробуй изменить путь в переменной $data_path, на полный:
Код

$data_path = "http://твой_домен.ru/files/";

Автор: Guest 11.5.2005, 19:19
Спасибо, справился!
Проблема была действительно в путях.

Автор: maddoc 14.5.2005, 01:35
Опять проблемаsmile
Закачиваю файл, данный код имеется в 4 местах, в трех все ок, а в четвертом
не работает, проблема с тем, что while не отрабатывает
Передаю $path как и везде это обычная форма type=file
Везде ок, а тут?

while($bytesread=read($path, $buffer, 512))
{$binfile.=$buffer;}

$pathname = $path;
$position = rindex($pathname, "\\") + 1;
$filename = substr($pathname, $position);


open F,">$data_pic_path$filename";
binmode F;
print F $binfile;
close F;

Автор: korob2001 14.5.2005, 02:34
Цитата

$position = rindex($pathname, "\\") + 1;

А в переменной $pathname путь точно указан с обратными слешами???

ЗЫ: А зачем ты читаешь весь файл в пременную ( в память ), а затем эту переменную загоняешь в файл. Записывай всё в файл в течении цикла, много памяти сэкономишь.

Автор: maddoc 14.5.2005, 10:29
Так вот в этом то и проблема, цикл не выполняется (while) , а
position = rindex($pathname, "\\") + 1; выполняется правильно(она
извлекает название файла и его расширение из строки $pathname, при то удачно)

Автор: korob2001 14.5.2005, 12:39
Попробуй так.
Код

$pathname = $path;
$position = rindex($pathname, "\\") + 1;
$filename = substr($pathname, $position);
open(  F, "> $data_pic_path$filename" ) or die $!;
          binmode F;
          binmode $path;
          print F $binfile while ( read( $path, $buffer, 512) );
close( F );

Много памяти сэкономишь. smile

Зы: проблема в этой строке:
Код

while($bytesread=read($path, $buffer, 512))

Для чего тут переменная $bytesread ????

Автор: maddoc 14.5.2005, 20:59
да, проблема именно в этой строке,
а именно в том что переменная $buffer
остается пустой, и сам цикл
while($bytesread=read($path, $buffer, 512))
не срабатывает,
хотя переменная $path не пустая, и там все ок с путями

Автор: maddoc 15.5.2005, 01:26
smile

Добавлено @ 01:34
smile забыл multipart\form-data

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