jsp - Динамическая загрузка файла с сервака
Модератор: Absurd
-
- Сообщения: 497
- Зарегистрирован: 17 фев 2004, 11:26
- Откуда: Ленинград (который Город на Неве)
- Контактная информация:
Господа! Есть вопросец. Имеем - jsp страничку. На страничке сцылко. Допустим на mydata.dat, которого нет. Хочется, чтобы этот отстой генерировался на лету и выплёвывался как file download. Есть у кого пример? Как бы это сделать?
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)
viel spass, DeeJayC
viel spass, DeeJayC
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
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,
но я уверен, что и у других уважающих себя серверов должны быть подобные настройки.
В подфоруме "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,
но я уверен, что и у других уважающих себя серверов должны быть подобные настройки.
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
а вот ещё другой, более "грязный", вариант с использованием 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 реализовать его, ИМХО, намного проще
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 реализовать его, ИМХО, намного проще
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
пример первого варината (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. странно, почему я считаю, что второй вариант всё же проще?...
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. странно, почему я считаю, что второй вариант всё же проще?...
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
ну и второй вариант:
[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]
[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);
?>
- Oscar
- Сообщения: 963
- Зарегистрирован: 29 май 2004, 13:44
- Откуда: Мюнхен (рожден в Киеве)
- Контактная информация:
Недостатки второго варианта:
1. onMouseOver=change statusbar - это обман (некоторые браузеры запрещают это делать)
2. если JS не сработает, или пользователь запомнит прямую ссылку - данные не будут обновляться
Преимущества:
1. Независимость кода от сервера (если запрещено менять настройки сервера или нужна портабельность кода)
2. Независимость клиентского кода от реализации (создание файла можно написать на любом языке программирования)
Преимущества первого варианта:
1. "чистота" решения (эффективность - сервер отвечает за всё)
2. надёжность - пользователь не сможет получить файл в обход скрипта его создающего
Недостаток : отсутствие гибкости
P.S. прощу прощения за примеры на PHP, никак не могу настроить Tomcat для доступа по DNS имени
1. onMouseOver=change statusbar - это обман (некоторые браузеры запрещают это делать)
2. если JS не сработает, или пользователь запомнит прямую ссылку - данные не будут обновляться
Преимущества:
1. Независимость кода от сервера (если запрещено менять настройки сервера или нужна портабельность кода)
2. Независимость клиентского кода от реализации (создание файла можно написать на любом языке программирования)
Преимущества первого варианта:
1. "чистота" решения (эффективность - сервер отвечает за всё)
2. надёжность - пользователь не сможет получить файл в обход скрипта его создающего
Недостаток : отсутствие гибкости
P.S. прощу прощения за примеры на PHP, никак не могу настроить Tomcat для доступа по DNS имени
-
- Сообщения: 497
- Зарегистрирован: 17 фев 2004, 11:26
- Откуда: Ленинград (который Город на Неве)
- Контактная информация:
js на всех тачках отключён - первый вариант подойдёт. у меня, правда csv.
"Особое внимание начинающих аквариумистов хотим обратить на то, что рыбки никогда не спят на спинке!" (c)
viel spass, DeeJayC
viel spass, DeeJayC