Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / ZEN: ссылка на загрузку файла / 14 сообщений из 14, страница 1 из 1
02.12.2009, 12:01
    #36342972
13-й Пилигрим
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
Добрый день.
Такая вот задачка образовалась: на сервере лежит файл (к примеру *.pdf), нужно отдать его пользователю (к примеру дать ссылку на него) для скачивания. При этом необходимым условием является исключение возможности скачать этот файл любыми способами кроме как по предоставленной уникальной ссылке конкретному пользователю (идентификация, к примеру, по %session.SessionId)
Есть какие-нибудь соображения?
...
Рейтинг: 0 / 0
02.12.2009, 12:15
    #36343008
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
полагаю это можно сделать так

создаете ZEN страницу,
в которой принимаете через урл к примеру имя файла или его идентификатор, как пожелаете
проверяете доступ пользователя по сессии к файлу
создаете читаете файл

переопределяете OnPreHTTP()
в зависимости от типа файла указываете соответствующий CONTENTTYPE
к примеру
Код: plaintext
s %response.ContentType="application/vnd.ms-excel"
и дальше в onPage просто выводите содержимое файла

только такой способ не будет поддерживать докачки, но для маленьких файлов и в эпоху быстрого интернета это думаю уже не важно
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
02.12.2009, 12:16
    #36343010
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
правда тут еще минус, именем файла для сохранения пользователю, будет имя вашего класса
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
02.12.2009, 12:49
    #36343113
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
13-й ПилигримЕсть какие-нибудь соображения?

Не совсем понятна задача... С одной стороны не проблема дать ссылку на файл для скачивания... С другой, воспользоваться этой ссылкой может только тот, кто сдоступом...
Так?

Тогда, что мешает показывать эту ссылку только авторизованому пользователю?
...
Рейтинг: 0 / 0
02.12.2009, 14:10
    #36343354
13-й Пилигрим
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
krvsa13-й ПилигримЕсть какие-нибудь соображения?

Не совсем понятна задача... С одной стороны не проблема дать ссылку на файл для скачивания... С другой, воспользоваться этой ссылкой может только тот, кто сдоступом...
Так?

Тогда, что мешает показывать эту ссылку только авторизованому пользователю?

Да показать-то не проблема. Вот только не сможет ли какой-нибудь нехороший человек, просканировав каталоги сайта, обнаружить и скачать лежащие там документы?

Да, и еще вопрос, общего плана: где физически должны лежать файлы, если адрес ресурса, к примеру https://www.somedomen.ru/csp/namespace/application.page.cls ? В IIS в :
Код: plaintext
1.
2.
3.
4.
5.
6.
-Web Sites
 -Default Web Site 
   -csp
     -user
     -samles
     ...
Т.е., как я понимаю, файл должен лежать в одном из расшаренных каталогов и тогда ссылка на файл будет вида https://www.somedomen.ru/csp/namespace/somefile.pdf ? Так?
...
Рейтинг: 0 / 0
02.12.2009, 14:18
    #36343388
krvsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
13-й ПилигримВот только не сможет ли какой-нибудь нехороший человек, просканировав каталоги сайта, обнаружить и скачать лежащие там документы?

Х\з на что способны эти "нехорошие человеки"...

13-й ПилигримТак?

Думается что в csp/namespace должен лежать файл...
...
Рейтинг: 0 / 0
02.12.2009, 14:24
    #36343405
13-й Пилигрим
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
DAiMorполагаю это можно сделать так

создаете ZEN страницу,
в которой принимаете через урл к примеру имя файла или его идентификатор, как пожелаете
проверяете доступ пользователя по сессии к файлу
создаете читаете файл

переопределяете OnPreHTTP()
в зависимости от типа файла указываете соответствующий CONTENTTYPE
к примеру
Код: plaintext
s %response.ContentType="application/vnd.ms-excel"
и дальше в onPage просто выводите содержимое файла

только такой способ не будет поддерживать докачки, но для маленьких файлов и в эпоху быстрого интернета это думаю уже не важно
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
Class abonent.pcPayOrderForm Extends %ZEN.Component.page
{

ClassMethod %OnPreHTTP() As %Boolean [ ServerOnly =  1  ]
{
	s %response.ContentType = "application/pdf"
	q $$$OK
}

ClassMethod OnPage() As %Status
{
	s FileSource = "c:\sys\cache\reports\test.pdf"
	s BufferSize= 2048 , count= 0 
	o FileSource:(/read:/fixed:/recordsize=BufferSize)
	u FileSource
	f {
		r buffer(count)
		q:$l(buffer(count))<BufferSize
		i $i(count)
	}
	c FileSource
	s idx="" f {
		s idx=$o(buffer(idx)) q:idx=""
		&html<#(buffer(idx))#>
	}
	Quit $$$OK
}

}

Вот что-то похожее накидал. Но что-то ерунда какая-то получается...
...
Рейтинг: 0 / 0
02.12.2009, 15:38
    #36343721
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
а вот мой вариант
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Class User.file Extends %ZEN.Component.page
{

Parameter FilePath = "d:\";

ClassMethod %OnPreHTTP() As %Boolean [ ServerOnly =  1  ]
{
	s %response.ContentType = "application/pdf"
	
	s filename="doc.pdf"
				
	d %response.SetHeader("content-disposition","filename="_filename)
	d %response.SetHeader("Accept-Ranges","bytes")
	
	S id=##class(%FileCharacterStream).GetStreamIdForFile(..#FilePath_filename)
	S stream=##class(%FileCharacterStream).%Open(id)
	d %response.SetHeader("Content-Length",stream.Size)
	
	s %session.Data("stream")=stream	
	q $$$OK
}

ClassMethod OnPage() As %Status
{
	s stream=%session.Data("stream")
	D stream.OutputToDevice()
	Quit $$$OK
}


}

_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
03.12.2009, 10:16
    #36345125
13-й Пилигрим
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
DAiMorа вот мой вариант

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
Class User.file Extends %ZEN.Component.page
{

Parameter FilePath = "d:\";

ClassMethod %OnPreHTTP() As %Boolean [ ServerOnly =  1  ]
{
	s %response.ContentType = "application/pdf"
	
	s filename="doc.pdf"
				
	d %response.SetHeader("content-disposition","filename="_filename)
	d %response.SetHeader("Accept-Ranges","bytes")
	
	S id=##class(%FileCharacterStream).GetStreamIdForFile(..#FilePath_filename)
	S stream=##class(%FileCharacterStream).%Open(id)
	d %response.SetHeader("Content-Length",stream.Size)
	
	s %session.Data("stream")=stream	
	q $$$OK
}

ClassMethod OnPage() As %Status
{
	s stream=%session.Data("stream")
	D stream.OutputToDevice()
	Quit $$$OK
}


}

_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST

Спасибо, этот вариант работает. Не до конца, правда, разобрался как разные браузеры реагируют, но это ладно... Вот теперь нужно немного усложнить задачу. Файл для вывода должен читаться не прямо с диска а через промежуточную переменную. Что-то вроде этого:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
Class User.file Extends %ZEN.Component.page
{
	
Parameter FilePath = "d:\";

ClassMethod %OnPreHTTP() As %Boolean [ ServerOnly =  1  ]
{
	s %response.ContentType = "application/pdf"
	d %response.SetHeader("content-disposition","filename=doc.pdf")
	d %response.SetHeader("Accept-Ranges","bytes")
	
	s filename="doc.pdf"
	
	s ret = ..GetStream(..#FilePath_filename,.OutStream)
		
	s stream=##class(%GlobalBinaryStream).%New()
	
	s idx = "" f {
		s idx = $o(OutStream(idx)) q:idx=""
		d stream.WriteLine(OutData(idx))
	}
	
	d %response.SetHeader("Content-Length",stream.Size)
	
	s %session.Data("stream")=stream	
	q $$$OK
}

ClassMethod GetStream(FileName as %String, ByRef OutData as %CacheString) as %Status
{
	s stream=##class(%FileBinaryStream).%New()
	s stream.Filename=FileName
	while 'stream.AtEnd {
		s buffer=stream.Read()
		s OutData($i(OutData))=buffer
	}
	q $$$OK
}

ClassMethod OnPage() As %Status
{
	s stream=%session.Data("stream")
	D stream.OutputToDevice()
	Quit $$$OK
}

}

Не спрашивайте, зачем нужны такие извращения... Нужны... Подскажите как привести это к рабочему виду. А то что-то пока не совсем получается. Документ выводится, но с ошибками.
...
Рейтинг: 0 / 0
03.12.2009, 10:33
    #36345178
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
в коде который вы привели есть 1 простая ошибка, из-за которой не работает

автор s idx = $o(OutStream(idx)) q:idx=""
d stream.WriteLine( OutStream (idx))

_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
03.12.2009, 10:57
    #36345258
13-й Пилигрим
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
DAiMorв коде который вы привели есть 1 простая ошибка, из-за которой не работает

автор s idx = $o(OutStream(idx)) q:idx=""
d stream.WriteLine( OutStream (idx))

_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST

Да не... :( Это я потом у себя сам нашел. Не помогло. Adobe пишет "Невозможно извлечь встроенные шрифты". При этом в вашем варианте все нормально.
...
Рейтинг: 0 / 0
03.12.2009, 11:11
    #36345326
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
ну про встроенные шрифты, это уже что-то другое

у меня все равботает
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
03.12.2009, 12:06
    #36345531
13-й Пилигрим
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
Разобрался :) Оказалось, что нужно использовать только Read , и только Write , а не ReadLine и WriteLine
...
Рейтинг: 0 / 0
03.12.2009, 12:09
    #36345542
DAiMor
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ZEN: ссылка на загрузку файла
ну все правильно Read() читает блочно
а писали во второй stream по строчно, который перевод строки добавлял

_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / ZEN: ссылка на загрузку файла / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]