Страница 1 из 1

jsp - Динамическая загрузка файла с сервака

Добавлено: 07 май 2007, 18:49
DeeJayC
Господа! Есть вопросец. Имеем - jsp страничку. На страничке сцылко. Допустим на mydata.dat, которого нет. Хочется, чтобы этот отстой генерировался на лету и выплёвывался как file download. Есть у кого пример? Как бы это сделать?

Re: jsp - Динамическая загрузка файла с сервака

Добавлено: 07 май 2007, 20:47
Oscar
DeeJayC, а обязательно ли нужно, чтобы ссылка была именно на несуществующий файл?

В подфоруме "PHP" последняя актуальная тема - "Скачка файлов".
Если не ошибаюсь, то с jsp должно быть то же самое:
1. даём ссылку на download.jsp с GET или POST параметром - имя файла
2. в download.jsp первым делом прописываем HTTP хэдеры (Content-type, Content-Disposition)
3. далее выводим в body документа необходимый контент

php ли это, или jsp, думаю, дело лишь синтаксиса,
ведь в конечном итоге это лишь "утилиты", которые "пишут" HTML (HTTP?) код

А если уж действительно хочется, чтобы ссылка была ОБЯЗАТЕЛЬНО на имя несуществующего файла, а не на скрипт,
то можно описать так называемые "Rewrite Rules" у сервера (имя взято от Apache)
В Apache работают они так:
браузер обращается по адресу test.com/mydata.dat
а сервер "редиректит" запрос на test.com/download.jsp?filename=mydata.dat
Причём редирект можно делать как явно (у пользователе в браузере высветится новый адрес),
так и неявно (пользователь уверен, что перешел на mydata.dat, а на самом деле сработал download.jsp)

Этот пример, как я уже сказал, построен на идеологии Apache,
но я уверен, что и у других уважающих себя серверов должны быть подобные настройки.

Re: jsp - Динамическая загрузка файла с сервака

Добавлено: 07 май 2007, 20:56
Oscar
а вот ещё другой, более "грязный", вариант с использованием JavaScript:

1. ссылка - пустая, к ней прикручена JS функция download() на OnClick
2. на JS при mouseOver показываем пользователю, что ссылка указывает, типа, на mydata.dat (записываем это имя в строку статуса браузера), при mouseOut - обнуляем статусную строку (старый метод, вредоносные сайты прятали так свои ссылки когда-то, может и сейчас такие есть .. )
3. ф-ция download запускает в бэкграунде (в спрятанном фрейме, или через ассинхронную связь "Ajax") download.jsp?filename=mydata.dat,
который на самом деле заново создаёт mydata.dat,
после чего пользователь (при помощи того же JS) "перекидывается" на test.com/mydata.dat

недостатков этого метода могу назвать много,
но при знании JS реализовать его, ИМХО, намного проще

Re: jsp - Динамическая загрузка файла с сервака

Добавлено: 07 май 2007, 21:09
Oscar
пример первого варината (Apache + PHP):

index.html
[HTML]<a href="mydata.jpg">mydata.jpg</a>[/HTML]

.htaccess
[syntax="Apache"]RewriteEngine On
RewriteRule mydata.jpg mydata.php
[/syntax]

mydata.php
[syntax="PHP"]<?php
header('Content-type: image/jpg');
header('Content-Disposition: attachment; filename="mydata.jpg"');

readfile('dummy.jpg');
?>
[/syntax]

P.S. странно, почему я считаю, что второй вариант всё же проще?...

Re: jsp - Динамическая загрузка файла с сервака

Добавлено: 07 май 2007, 21:30
Oscar
ну и второй вариант:

[HTML]<script>
function redirect() {
window.location = "mydata.jpg";
}
function download() {
var mydata = document.getElementById("mydata");
mydata.onload = redirect;
mydata.src = "mydata.php";
}
</script>
<iframe id="mydata" style="width: 0; height: 0; position: absolute; top: 0; left: 0; border-width: 0;"></iframe>
<a href="javascript:download();" onMouseOver="window.status='mydata.jpg'" onMouseOut="window.status=''">mydata.jpg</a>[/HTML]

Код: Выделить всё

<?php
        $fp = fopen("mydata.jpg", 'w+');
        fwrite($fp, implode('', file('dummy.jpg')));
        fclose($fp);
?>

Re: jsp - Динамическая загрузка файла с сервака

Добавлено: 07 май 2007, 21:40
Oscar
Недостатки второго варианта:

1. onMouseOver=change statusbar - это обман (некоторые браузеры запрещают это делать)
2. если JS не сработает, или пользователь запомнит прямую ссылку - данные не будут обновляться

Преимущества:

1. Независимость кода от сервера (если запрещено менять настройки сервера или нужна портабельность кода)
2. Независимость клиентского кода от реализации (создание файла можно написать на любом языке программирования)

Преимущества первого варианта:

1. "чистота" решения (эффективность - сервер отвечает за всё)
2. надёжность - пользователь не сможет получить файл в обход скрипта его создающего

Недостаток : отсутствие гибкости

P.S. прощу прощения за примеры на PHP, никак не могу настроить Tomcat для доступа по DNS имени

Re: jsp - Динамическая загрузка файла с сервака

Добавлено: 08 май 2007, 11:38
DeeJayC
js на всех тачках отключён - первый вариант подойдёт. у меня, правда csv.

Re: jsp - Динамическая загрузка файла с сервака

Добавлено: 09 май 2007, 12:30
DeeJayC
Всё получилось, как и в php варианте. Спасибо.