Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Перл. Отправка файла???

4.5K
18 сентября 2003 года
antoninka
7 / / 18.09.2003
Написал скрипт авторизации. После авторизации скриптом создаются символические ссылки на файлы.

А вот и сама проблема:
Надо либо чтобы скрипт ждал пока пользователь скачает файл (если конечно в перле есть такая функция), либо насильно ему закачивать конкретный файл в зависимости от его выбора.

После закачки файлы разлинковываются чтобы никто их по URL-у не достал(разлинковать мне тоже удалось).

пробовал с помощью Net::FTP - не выходит (на хостинге не дают - и вообще у них с модулями не очень получается).

пробовал просто хтмльными хрефами - тоже не выходит (ссылки разлинковываются быстрее чем пользователь успевает их скачать).

почтой отправлять не хочу (файлы довольно большие)

нигде не нашел решения этой проблемы - перерыл кучу сайтов со скриптами - ну нету нигде.

помогите.
283
19 сентября 2003 года
Alone
910 / / 20.11.2002
эээ...
а может не нужно изобретать велосипед и отдавать файл скрптом(не ссылки на него а именно файл)?
И что это вы такое хотели делать модулем Net::FTP? :D
По FTP закачивать файл клиенту чтоли? :D
4.5K
21 сентября 2003 года
antoninka
7 / / 18.09.2003
Цитата:
Originally posted by Alone
эээ...
а может не нужно изобретать велосипед и отдавать файл скрптом(не ссылки на него а именно файл)?
И что это вы такое хотели делать модулем 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-файлом (открывается винзипом, показывает содержание и корректно его разжимает). Как бы это исправить?

283
21 сентября 2003 года
Alone
910 / / 20.11.2002
мдааа...
разработка ядерной много функцианальной интелектуальной открывалки банок... неиначе :)
довай по порядку:
- 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);
4.5K
21 сентября 2003 года
antoninka
7 / / 18.09.2003
Цитата:
Originally posted by Alone

Попробуй так:
#!/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.

283
22 сентября 2003 года
Alone
910 / / 20.11.2002
Цитата:
Originally posted by antoninka

Так тоже работает, но имя файла все равно пишет не то. На сей раз он его из какогото мусора составляет, и расширение не добавляет.



print "Content-Length: ", -s 'документ' ,"\n";
print "Content-Disposition: attachment; filename=Как называть\n\n";
То что выделенно не забыи заменить на свое?

Цитата:
Originally posted by antoninka

Насчет проксей вопрос ведь тоже можно решить
($ENV{'HTTP_X_FORWARDED_FOR'}).


Не получится :)


Цитата:
Originally posted by antoninka

А где вообще можно почитать про заголовки различных документов? Что-то на этом сайте я видел только про Content-type и типы Mime.


Поиск рулит :)
http://detail.phpclub.net/2001-03-26.htm
http://detail.phpclub.net/2001-04-02.htm

4.5K
22 сентября 2003 года
antoninka
7 / / 18.09.2003
Цитата:

То что выделенно не забыи заменить на свое?



Заменил я на свое - все равно не обзывает файлы так как я этого хочу.

Самое забавное, что строка содежащая Content-Displacement: Attachment - лишняя!!! Я попытался отправить таким макаром зип файл, а он у меня почему-то не открывался, тогда я забил в скрипт отправку текстового файла, и что же я увидел:

Content-Displacement:...и так далее....

ваппааполлролроролрлролрлролролролапрап
ролролролрлролролроролролролллррррапрар
.
.
.
(остальное содержание текстового файла)
.
.
.
вапвапвапвапвапвапвапвапвапвапвапвапвап


А когда я удалил эту строку, то все стало исправно отправляться и без ошибок. Однако принимаемый файл по-прежнему называется oc.cgi

Вы только не подумайте, что я Вас ругаю, я наоборот, очень Вам благодарен за советы (лично я не догадался бы какой Mime-type надо указать в заголовке, чтобы файл отправлялся). Видимо это глюки хостинга (хостинг-то халявный).

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

283
22 сентября 2003 года
Alone
910 / / 20.11.2002
Чесно говоря мне даже интересно стало что вы не так делает...
Хостинг тут не причем(наверное)
Покажите как вы это делаете
Content-Displacement необязателен... если вы конечно не хотите задовать как называть файл при скачке

еще раз
#начало
Content-Type: application/x-www-form-urlencoded\n
Content-Length: размер передоваемого файла\n
Content-Disposition: attachment; filename=как называть\n\n
содержимое файла
#конец

все, скрипт ваш больше ничего не должен выводить
4.5K
22 сентября 2003 года
antoninka
7 / / 18.09.2003
Цитата:
Originally posted by Alone
Чесно говоря мне даже интересно стало что вы не так делает...

#начало
Content-Type: application/x-www-form-urlencoded\n
Content-Length: размер передоваемого файла\n
Content-Disposition: attachment; filename=как называть\n\n
содержимое файла
#конец



Все верно, все заработало. Это я по собственной ДУРИ в конце
"Content-Length: размер передоваемого файла"
поставил не \n, а \n\n! Вот и получилось, что строка задающая имя файла оказалась не в заголовке а в теле документа, то бишь стала первой строкой файла!

...Пристрелите меня, пожалуйста...
...Ба-Бах...
...Спасибо...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог