Перл. Отправка файла???
А вот и сама проблема:
Надо либо чтобы скрипт ждал пока пользователь скачает файл (если конечно в перле есть такая функция), либо насильно ему закачивать конкретный файл в зависимости от его выбора.
После закачки файлы разлинковываются чтобы никто их по URL-у не достал(разлинковать мне тоже удалось).
пробовал с помощью Net::FTP - не выходит (на хостинге не дают - и вообще у них с модулями не очень получается).
пробовал просто хтмльными хрефами - тоже не выходит (ссылки разлинковываются быстрее чем пользователь успевает их скачать).
почтой отправлять не хочу (файлы довольно большие)
нигде не нашел решения этой проблемы - перерыл кучу сайтов со скриптами - ну нету нигде.
помогите.
а может не нужно изобретать велосипед и отдавать файл скрптом(не ссылки на него а именно файл)?
И что это вы такое хотели делать модулем Net::FTP? :D
По FTP закачивать файл клиенту чтоли? :D
эээ...
а может не нужно изобретать велосипед и отдавать файл скрптом(не ссылки на него а именно файл)?
И что это вы такое хотели делать модулем Net::FTP? :D
По FTP закачивать файл клиенту чтоли? :D
А что по фтп нельзя?
Ну да ладно мне тут подсказали, и я сделал все через сокеты, вот только вопрос возник (чтобы было понятно приведу код)
#!/usr/bin/perl
link("winwin.zip","1.zip");
use Socket;
$host="$ENV{'REMOTE_ADDR'}";$port="80";
socket(SOCK, PF_INET, SOCK_STREAM, getprotobyname('tcp'));$iaddr = inet_aton($host);
$paddr = sockaddr_in($port, $iaddr);
connect(SOCK, $paddr);
send (SOCK, "GET / HTTP/1.0\n\n", 0);
close(SOCK);
open(LIS,"1.zip");
@arr=<LIS>;
close(LIS);
print "$!\n";
print @arr;
unlink("1.zip");
Как-то странно, что файл во-первых отправляется после закрытия SOCK (если проводить аналогию с файлами то должно было бы быть print SOCK @arr;close(SOCK); - однако такая конструкция почему-то не работает), а во вторых называется он не 1.zip, а oc.cgi (название файла скрипта), хотя фактически является именно zip-файлом (открывается винзипом, показывает содержание и корректно его разжимает). Как бы это исправить?
разработка ядерной много функцианальной интелектуальной открывалки банок... неиначе :)
довай по порядку:
- FTP: если ты хочеш скриптом закачать(или получить) файл комуто то там должен стоять FTP-сервер(надеюсь понимаеш почему). Как по твоему у скольки людей в инете есть FTP-сервер с ананимным доступом (да еще глобальное IP)
- Твой скрипт: $ENV{'REMOTE_ADDR'} содержит IP машины запросившей твой документ(скрипт, страницу и т.д.) Причем IP последней машины в цепочке клиент-сервер. Что делать людям у которых нет глобальных IP или ходят через proxy?
Попробуй так:
#!/usr/bin/perl
print "Content-Type: application/x-www-form-urlencoded\n";
print "Content-Length: ", -s 'документ' ,"\n";
print "Content-Disposition: attachment; filename=Как называть\n\n";
open (fil,"<документ") or print "$!";
while (<fil>)
{
print $_;
}
close (fil);
Попробуй так:
#!/usr/bin/perl
print "Content-Type: application/x-www-form-urlencoded\n";
print "Content-Length: ", -s 'документ' ,"\n";
print "Content-Disposition: attachment; filename=Как называть\n\n";
open (fil,"<документ") or print "$!";
while (<fil>)
{
print $_;
}
close (fil);
Так тоже работает, но имя файла все равно пишет не то. На сей раз он его из какогото мусора составляет, и расширение не добавляет.
А насчет ядернрй открывашки - есть у меня такая черта. Дело в том, что я только начал изучать перл и знаю о нем не много, соответственно пытаюсь оперировать тем, чем располагаю.
Насчет проксей вопрос ведь тоже можно решить
($ENV{'HTTP_X_FORWARDED_FOR'}). Просто из тех заголовков которые Вы привели знаю я только два тот который Content-type и Content-length, а то, что есть еще и Content-Disposition с помощью которого можно файлы прикреплять я и не знал.
А где вообще можно почитать про заголовки различных документов? Что-то на этом сайте я видел только про Content-type и типы Mime.
Так тоже работает, но имя файла все равно пишет не то. На сей раз он его из какогото мусора составляет, и расширение не добавляет.
print "Content-Length: ", -s 'документ' ,"\n";
print "Content-Disposition: attachment; filename=Как называть\n\n";
То что выделенно не забыи заменить на свое?
Насчет проксей вопрос ведь тоже можно решить
($ENV{'HTTP_X_FORWARDED_FOR'}).
Не получится :)
А где вообще можно почитать про заголовки различных документов? Что-то на этом сайте я видел только про Content-type и типы Mime.
Поиск рулит :)
http://detail.phpclub.net/2001-03-26.htm
http://detail.phpclub.net/2001-04-02.htm
То что выделенно не забыи заменить на свое?
Заменил я на свое - все равно не обзывает файлы так как я этого хочу.
Самое забавное, что строка содежащая Content-Displacement: Attachment - лишняя!!! Я попытался отправить таким макаром зип файл, а он у меня почему-то не открывался, тогда я забил в скрипт отправку текстового файла, и что же я увидел:
Content-Displacement:...и так далее....
ваппааполлролроролрлролрлролролролапрап
ролролролрлролролроролролролллррррапрар
.
.
.
(остальное содержание текстового файла)
.
.
.
вапвапвапвапвапвапвапвапвапвапвапвапвап
А когда я удалил эту строку, то все стало исправно отправляться и без ошибок. Однако принимаемый файл по-прежнему называется oc.cgi
Вы только не подумайте, что я Вас ругаю, я наоборот, очень Вам благодарен за советы (лично я не догадался бы какой Mime-type надо указать в заголовке, чтобы файл отправлялся). Видимо это глюки хостинга (хостинг-то халявный).
Ладно, напишу на сайте большими буквами, как надо файлы называть.
Хостинг тут не причем(наверное)
Покажите как вы это делаете
Content-Displacement необязателен... если вы конечно не хотите задовать как называть файл при скачке
еще раз
#начало
Content-Type: application/x-www-form-urlencoded\n
Content-Length: размер передоваемого файла\n
Content-Disposition: attachment; filename=как называть\n\n
содержимое файла
#конец
все, скрипт ваш больше ничего не должен выводить
Чесно говоря мне даже интересно стало что вы не так делает...
#начало
Content-Type: application/x-www-form-urlencoded\n
Content-Length: размер передоваемого файла\n
Content-Disposition: attachment; filename=как называть\n\n
содержимое файла
#конец
Все верно, все заработало. Это я по собственной ДУРИ в конце
"Content-Length: размер передоваемого файла"
поставил не \n, а \n\n! Вот и получилось, что строка задающая имя файла оказалась не в заголовке а в теле документа, то бишь стала первой строкой файла!
...Пристрелите меня, пожалуйста...
...Ба-Бах...
...Спасибо...