share.rkt 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #lang racket/base
  2. (require racket/match
  3. web-server/servlet
  4. web-server/servlet-env
  5. web-server/formlets
  6. web-server/dispatch
  7. web-server/http
  8. racket/file
  9. threading
  10. xml)
  11. (provide (all-defined-out))
  12. (define (ensure-directory dir)
  13. (if (not (directory-exists? dir))
  14. (make-directory dir) null)
  15. dir)
  16. (define (download-link f)
  17. `(a ((href ,(path->string f)))
  18. ,(path->string f)))
  19. (define upload-dir
  20. (ensure-directory
  21. (build-path
  22. (find-system-path 'orig-dir)
  23. "uploads")))
  24. (define (start request)
  25. (app-dispatch request))
  26. (define-values (app-dispatch app-url)
  27. (dispatch-rules
  28. (("") share)))
  29. (define (respond-unknown-file req)
  30. (response/xexpr
  31. #:code 404 #:message #"ERROR"
  32. `(html (body "Not found."))))
  33. (define (share initial-req #:message (message ""))
  34. (define req
  35. (send/suspend
  36. (lambda (k-url)
  37. (response/xexpr
  38. `(html
  39. (body
  40. (title "File Sharing Server")
  41. (div ,message)
  42. (form ((action ,k-url)
  43. (method "post")
  44. (enctype "multipart/form-data"))
  45. (h2 "Upload files:")
  46. (input ((type "file")
  47. (name "file")
  48. (multiple "multiple")))
  49. (br)
  50. (input ((type "submit")
  51. (value "Upload"))))
  52. (h2 "Shared files:")
  53. (ul ,@(map (λ (f) `(li ,(download-link f)))
  54. (directory-list upload-dir)))))))))
  55. (define (save-files b)
  56. (current-directory upload-dir)
  57. (match b
  58. ((struct binding:file (field filename headers content))
  59. (if (> (bytes-length filename) 0)
  60. (begin
  61. (display-to-file content
  62. (bytes->string/utf-8 filename)
  63. #:exists 'replace)
  64. `(li ,(~> filename
  65. bytes->string/utf-8
  66. build-path
  67. download-link)))
  68. "No files uploaded."))))
  69. (response/xexpr
  70. (share req #:message
  71. `(html (body
  72. (h3 "You uploaded:")
  73. (ul ,@(map save-files (request-bindings/raw req))))))))
  74. (define (main)
  75. (serve/servlet start
  76. #:servlet-path "/"
  77. #:port 8080
  78. #:launch-browser? #f
  79. #:extra-files-paths (list (build-path "static")
  80. (build-path "uploads"))
  81. #:file-not-found-responder respond-unknown-file
  82. #:server-root-path (current-directory)))