powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / ZEN: ссылка на загрузку файла
14 сообщений из 14, страница 1 из 1
ZEN: ссылка на загрузку файла
    #36342972
13-й Пилигрим
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Такая вот задачка образовалась: на сервере лежит файл (к примеру *.pdf), нужно отдать его пользователю (к примеру дать ссылку на него) для скачивания. При этом необходимым условием является исключение возможности скачать этот файл любыми способами кроме как по предоставленной уникальной ссылке конкретному пользователю (идентификация, к примеру, по %session.SessionId)
Есть какие-нибудь соображения?
...
Рейтинг: 0 / 0
ZEN: ссылка на загрузку файла
    #36343008
Фотография 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
...
Рейтинг: 0 / 0
ZEN: ссылка на загрузку файла
    #36343010
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
правда тут еще минус, именем файла для сохранения пользователю, будет имя вашего класса
_________________________________
Cache for Windows NT (AMD64) 5.0.21 (Build 6408) Tue Jan 3 2006 13:37:41 EST
...
Рейтинг: 0 / 0
ZEN: ссылка на загрузку файла
    #36343113
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13-й ПилигримЕсть какие-нибудь соображения?

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

Тогда, что мешает показывать эту ссылку только авторизованому пользователю?
...
Рейтинг: 0 / 0
ZEN: ссылка на загрузку файла
    #36343354
13-й Пилигрим
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ZEN: ссылка на загрузку файла
    #36343388
Фотография krvsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
13-й ПилигримВот только не сможет ли какой-нибудь нехороший человек, просканировав каталоги сайта, обнаружить и скачать лежащие там документы?

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

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

Думается что в csp/namespace должен лежать файл...
...
Рейтинг: 0 / 0
ZEN: ссылка на загрузку файла
    #36343405
13-й Пилигрим
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ZEN: ссылка на загрузку файла
    #36343721
Фотография 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
...
Рейтинг: 0 / 0
ZEN: ссылка на загрузку файла
    #36345125
13-й Пилигрим
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ZEN: ссылка на загрузку файла
    #36345178
Фотография 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
...
Рейтинг: 0 / 0
ZEN: ссылка на загрузку файла
    #36345258
13-й Пилигрим
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
ZEN: ссылка на загрузку файла
    #36345326
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну про встроенные шрифты, это уже что-то другое

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

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


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