LINUX.ORG.RU

sbcl hunchentoot - download файла


0

0

У меня имеется диспетчер запросов, который их некоторым образом обрабатывает. Если в результате пользователь захочет скачать файл с моего сервера, но прямой ссылки он не получит, как с помощью hunchentoot'а «отправить» файл пользователю так, чтобы он увидел окошко «Сохранить файл как»?

http://archimag-dev.blogspot.com/2010/01/restas.html - читал это, но оно противоположно моей задаче. Гугль тоже молчит.

★★

попробуй добавить хедеры
Content-Type=«application/xxx-your-type»
Content-Disposition = «attachment; filename=YourFileName.extension»

k0l0b0k ★★
()
Ответ на: комментарий от archimag

Может быть в нем есть какая-то функция аля send-file-to-download, которая проделывает все эти операции. Если нет, то как это сделать?

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

Может быть в нем есть какая-то функция аля send-file-to-download



Есть функция hunchentoot:handle-static-file, которая сделает всё, что нужно, кроме выставления поля Content-Disposition, что можно сделать с помощью

(setf (hunchentoot:header-out :content-disposition)
       "attachment; filename=YourFileName.extension")

archimag ★★★
()
Ответ на: комментарий от archimag
(defun request-download-page (&optional request)
  (setf (hunchentoot:content-type*) "text/plain")
  (setf (hunchentoot:header-out "content-type") "text/plain")
  (setf (hunchentoot:header-out "content-disposition") "attachment; filename=test.c")
  "fuck-my-brain")

я посчитал диспетчер через regex более гибким, сделал немного иначе. спасибо.

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

Зачем «Content-Type» два раза выставляешь? Одного раза вполне достаточно :) И это, технически не совсем верно указывать имена полей как «content-type» и «content-disposition», ибо первые буквы должны быть заглавными. Благо сейчас hunchentoot сначала переводит эти строки в keyword, а из них уже снова генерит строки. Более технично (а будущем возможно и более корректно) указывать сразу в виде keyword - :content-type и :content-disposition.

я посчитал диспетчер через regex более гибким


Гибкости там не намного больше, а затрат на разработку (а также машинных при большом количестве обработчиков) намного больше, но дело хозяйское.

archimag ★★★
()
Ответ на: комментарий от archimag

Зачем «Content-Type» два раза

Да, заметил уже после постинга :)

указывать сразу в виде keyword

Спасибо, буду знать.

Кстати, а если у меня файл очень большой, например, 2ГБ видео - глупо его бинарно считывать и вписывать в html.

Что лучше сделать в этом случае?

У меня есть идея, что надо генерить символическую ссылку и как-то ее пропихивать, правда, не знаю как.

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

Сделал так:

(hunchentoot:create-static-file-dispatcher-and-handler "/avatar_.avi" "/media/20D022BBD0229756/_ubuntu/avatar.avi")

Вроде работает.

bk_ ★★
() автор топика
Ответ на: комментарий от bk_

> 2ГБ видео - глупо его бинарно считывать и вписывать в html.

При чём тут html? Разве в коде выше ты отдавал файл в hmtl? Я указал выше функцию hunchentoot:handle-static-file - она вычитает и отдаст файл клиенту. Правда, насчёт 2 Гб не вполне уверен, что это хорошая мысль, настолько я помню, эта функция сейчас не поддерживает докачку и т.п. функционал, так что в случае нестабильного соединения это будет работать плохо.

P.S. Вообще, судя по всему, для начала было бы неплохо ознакомиться что такое HTTP, HTML и прочие базовые вещи ;)

archimag ★★★
()
Ответ на: комментарий от archimag

Да, в этом у меня некоторый пробел, ибо изначально работал только с клиентским программированием :)

Я пробую сделать что-то типа http://www.rejetto.com/hfs/ (цель не в том, чтобы _сделать_, а просто научиться cl, и если что-то получиться, то тогда вообще убью двух зайцев).

Сейчас я сделал так:

(hunchentoot:create-regex-dispatcher "^/d4$" 'request-download2-page)

(defun request-download2-page (&optional request)
  (with-http-authentication
      (hunchentoot:handle-static-file "/media/20D022BBD0229756/_ubuntu/avatar.avi")))

(defmacro with-http-authentication (&rest body)
  `(multiple-value-bind (username password) (hunchentoot:authorization)
     (cond ((and (string= username "aaa") (string= password "321")) ,@body)
	   (t (hunchentoot:require-authorization "This is fucking web-server. If you haven't login & password please enter login 'anonymous' and password 'anonymous'.")))))

Если все это красиво переписать, то получится то, что я хочу.

А на счет сложности regex-диспатчинга, я думаю, что можно будет сделать разделение запросов на «hostname/video», «hostname/audio» и т.д., и уже в самой функции диспетчеризации смотреть дальше - «hostname/video/avatar.avi» или же сделать с гет-параметром «hostname/video?id=avatar».

Еще раз спасибо за помощь.

bk_ ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.