вторник, 19 января 2010 г.

Простейшая загрузка файла с помощью RESTAS

После предыдущего поста меня попросили показать пример использования RESTAS для загрузки файла. Формально говоря, этот вопрос не имеет отношения к RESTAS, ибо решается за счёт средств hunchentoot, но тем не менее:
(asdf:operate 'asdf:load-op :cl-who)
(asdf:operate 'asdf:load-op :restas)

(restas:defsite :restas.example-3
(:use :cl))

(in-package :restas.example-3)

(define-route main ("" :method :get)
(who:with-html-output-to-string (out)
(:html
(:body
((:form :method :post
:enctype "multipart/form-data")
((:input :name "file"
:type "file"))
(:br)
((:input :type "submit"
:value "Send")))))))

(define-route main/post ("" :method :post)
(let ((file-info (hunchentoot:post-parameter "file")))
(if file-info
(who:with-html-output-to-string (out)
(:html
(:body
(:div
(:b "Name: ")
(who:str (second file-info)))
(:div
(:b "Content-Type: ")
(who:str (third file-info)))
(:div
(:b "Content")
(:br)
(who:str (hunchentoot:escape-for-html (alexandria:read-file-into-string (first file-info)))))
((:a :href (restas:genurl 'main)) "Try again"))))
(restas:redirect 'main))))

(restas:start-site :restas.example-3 :port 8080)
Данный пример выводит форму, в которой предлагается указать файл для загрузки. После отправки формы на сервер отображается страница с информацией о загруженном файле: имя, content-type, а также выводится его содержимое (по этой причине данный пример работоспособен только с текстовыми файлами). Код в основном повторяет пример про обработку POST-запроса, но теперь вместо строки в форме отправляется файл. Основное отличие состоит в том, что вызов hunchentoot:post-parameter для файла возвращает не строку, а список, содержащий путь к загруженному файлу (во временной директории hunchentoot:*tmp-directory*), его имя и content-type.

3 комментария:

  1. ОМГ! Код в лучших традициях похапэ... а как же MVC? O_o

    ОтветитьУдалить
  2. И да... даже в UnCommonWeb (он кстати жив еще?) были темплейты... а тут безобразие какое-то :)

    ОтветитьУдалить
  3. @Cy6erBr4in
    MVC в стиле RoR или Django не нужен.
    В предыдущем посте я как раз и указывал, что лучше не использовать cl-who в реальных приложениях.

    ОтветитьУдалить