File: upload.hs

package info (click to toggle)
haskell-cgi 3001.5.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 164 kB
  • sloc: haskell: 828; makefile: 3
file content (40 lines) | stat: -rw-r--r-- 1,239 bytes parent folder | download | duplicates (4)
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
-- Accepts file uploads and saves the files in the given directory.
-- WARNING: this script is a SECURITY RISK and only for
-- demo purposes. Do not put it on a public web server.

import Data.Maybe (fromJust)

import qualified Data.ByteString.Lazy as BS (writeFile)
import Network.CGI
import Text.XHtml
   ( Html, paragraph, (!), href, (+++), form, method, enctype, afile, submit
   , renderHtml, header, thetitle, body, (<<), anchor
   )

dir :: String
dir = "../upload"

saveFile :: (MonadCGI m, MonadIO m) => String -> m Html
saveFile n =
    do cont <- fromJust <$> getInputFPS "file"
       let p = dir ++ "/" ++ basename n
       liftIO $ BS.writeFile p cont
       return $ paragraph << ("Saved as " +++ anchor ! [href p] << p +++ ".")

fileForm :: Html
fileForm = form ! [method "post", enctype "multipart/form-data"]
             << [afile "file", submit "" "Upload"]


basename :: String -> String
basename = reverse . takeWhile (`notElem` "/\\") . reverse

cgiMain :: CGI CGIResult
cgiMain =
    do mn <- getInputFilename "file"
       h <- maybe (return fileForm) saveFile mn
       output $ renderHtml $ header << thetitle << "Upload example"
                               +++ body << h

main :: IO ()
main = runCGI cgiMain