detect empty file upload submissions, show file operation result messages

This commit is contained in:
Gered 2013-05-26 14:51:34 -04:00
parent d3bd3342c9
commit 6b1627196c
2 changed files with 41 additions and 19 deletions

View file

@ -5,7 +5,12 @@
[blarg.util]) [blarg.util])
(:require [blarg.views.layout :as layout] (:require [blarg.views.layout :as layout]
[blarg.models.files :as files] [blarg.models.files :as files]
[noir.response :as resp])) [noir.response :as resp]
[noir.session :as session]))
(defn valid-upload? [file]
(and (not (nil? file))
(not-empty (:filename file))))
(defn list-files [path] (defn list-files [path]
(let [p (ensure-prefix-suffix path "/")] (let [p (ensure-prefix-suffix path "/")]
@ -13,26 +18,33 @@
"files/list.html" {:html-title (->html-title [(str "Files in " p)]) "files/list.html" {:html-title (->html-title [(str "Files in " p)])
:path p :path p
:files (files/list-files p) :files (files/list-files p)
:tree (files/get-tree)}))) :tree (files/get-tree)
:error (session/flash-get :file-error)
:success (session/flash-get :file-success)
:notice (session/flash-get :file-notice)})))
(defn handle-new-file [path file] (defn handle-new-file [path file]
(let [p (ensure-prefix-suffix path "/") (if (valid-upload? file)
filename (:filename file) (let [filename (:filename file)
tempfile (:tempfile file) tempfile (:tempfile file)
content-type (:content-type file) content-type (:content-type file)
id (str p filename) id (str path filename)
exists? (files/file-exists? id)] exists? (files/file-exists? id)]
(if-let [savedfile (if exists? (if-let [savedfile (if exists?
(files/update-file id tempfile content-type) (files/update-file id tempfile content-type)
(files/add-file p filename tempfile content-type))] (files/add-file path filename tempfile content-type))]
(resp/redirect (str "/listfiles" p)) (do
(throw (Exception. "Error uploading file"))))) (session/flash-put! :file-success "File uploaded successfully.")
(session/flash-put! :file-notice "Existing file with the same name was updated with the uploaded file."))
(session/flash-put! :file-error "File could not be uploaded.")))
(session/flash-put! :file-error "No file selected to upload."))
(resp/redirect (str "/listfiles" path)))
(defn handle-delete-file [file] (defn handle-delete-file [file]
(let [id (ensure-prefix file "/")]
(if-let [deleted (files/delete-file file)] (if-let [deleted (files/delete-file file)]
(resp/redirect "/listfiles") (session/flash-put! :file-success "File was deleted successfully.")
(throw (Exception. "Error deleting file"))))) (session/flash-put! :file-error "File could not be deleted."))
(resp/redirect "/listfiles"))
(defn get-file [path] (defn get-file [path]
(if-let [file (files/get-file path)] (if-let [file (files/get-file path)]
@ -42,6 +54,6 @@
(defroutes files-routes (defroutes files-routes
(restricted GET "/listfiles" [] (list-files "/")) (restricted GET "/listfiles" [] (list-files "/"))
(restricted GET "/listfiles/*" [*] (list-files *)) (restricted GET "/listfiles/*" [*] (list-files *))
(restricted POST "/uploadfile" [path file] (handle-new-file path file)) (restricted POST "/uploadfile" [path file] (handle-new-file (ensure-prefix-suffix path "/") file))
(restricted POST "/deletefile" [file] (handle-delete-file file)) (restricted POST "/deletefile" [file] (handle-delete-file (ensure-prefix file "/")))
(GET "/files/*" [*] (get-file *))) (GET "/files/*" [*] (get-file *)))

View file

@ -6,6 +6,16 @@
<h2>Index of {{path}}</h2> <h2>Index of {{path}}</h2>
</div> </div>
{% if success %}
<div class="alert alert-success">{{success}}</div>
{% endif %}
{% if error %}
<div class="alert alert-error">{{error}}</div>
{% endif %}
{% if notice %}
<div class="alert alert-info">{{notice}}</div>
{% endif %}
<div> <div>
<div class="pull-left form-inline"> <div class="pull-left form-inline">
<select id="tree"> <select id="tree">