git clone 'https://github.com/fukamachi/mito-attachment.git'
The place to store files would be a problem when you intend to write a web application which allows file-uploading. These days, AWS S3 is a common place to store/serve files, however, it's not easy to manage like RDBMS.
Mito-attachment provides a Mito mixin class for managing files outside of RDBMS. It stores files before
mito:save-dao and deletes them before
Besides, the backend storage can be replaced easily. This makes it easy that using cloud storage services for production environment and using local filesystem for development environment.
(defvar *appenv* (uiop:getenv "APP_ENV")) ;; Setup storage class (setf *storage* (if (string= *appenv* "production") ;; Store files in AWS S3 for production environment (make-instance 's3-storage :bucket "mito-attachment-example" :endpoint "s3-ap-northeast-1.amazonaws.com" :access-key (uiop:getenv "AWS_ACCESS_KEY") :secret-key (uiop:getenv "AWS_SECRET_KEY")) ;; Store files in local filesystem for development environment (make-instance 'disk-storage :bucket "mito-attachment-example" :directory #P"/tmp/attachment/")))
;; Attachment class for saving metadata into RDBMS (defclass image (attachment) () (:metaclass mito:dao-table-class))
;; :content can be specified as a pathname or a stream. (mito:create-dao 'image :content #P"uploaded-file.png") ;; Override the file content-type (mito:create-dao 'image :content #P"uploaded-file.png" :content-type "image/png") ;; Use an original file-key (mito:create-dao 'image :content #P"uploaded-file.png" :file-key "image.png")
(let ((file (mito:find-dao 'image :id 1))) (file-url file)) ;-> ;; SELECT * FROM "image" WHERE ("id" = ?) LIMIT 1 (1) [1 row] | MITO.DB:RETRIEVE-BY-SQL ;=> "/mito-attachment-example/3616D80112884799B272DC962F4BBF97.jpg"
See example.lisp for getting the full example. It's a Lack web application which allows users to upload image files.
Copyright (c) 2016 Eitaro Fukamachi (email@example.com)
Licensed under the LLGPL License.