2014-04-01 34 views
1

我试图使用自定义:store选项wrap-multipart-params,而是我很明显得到默认存储。我的自定义函数甚至没有被调用。使用自定义:存储与环中间件包装multipart-params

(mp/wrap-multipart-params 
    (POST "/upload-x" request (upload/upload-file request)) 
    {:store upload/logging-store}) 

我的日志存储功能看起来是这样的(它只是现在一个虚拟的 - 最终我想处理一个自定义的方式流)是IO没有发生。

(defn logging-store [{filename  :filename 
         content-type :content-type 
         stream  :stream 
         :as params}] 
    (println "in logging store") 
    (pprint filename) 
    (pprint params) 
    filename) 

上传文件看起来是这样的:

(defn upload-file [{params :params 
        session :session :as request}] 
    (let [user-id (:user-id session) 
     files (get params "files")] 
    (pprint request) 
    (pprint params) 
    (response/response 
    {:status :success}))) 

该请求的打印和PARAMS显然在那里,他们正在临时文件存储处理,显示多PARAMS:

:multipart-params 
{"files" 
    {:size 1674, 
    :tempfile 
    #<File /var/folders/rx/9ntjyyvs35qbmcbp6rhfmj200000gn/T/ring-multipart-3853352501927893381.tmp>, 
    :content-type "application/octet-stream", 
    :filename "blog-test.clj"}}, 

编辑:应用程序定义(如需要)

(defroutes file-list-routes 
    (GET "/simple-upload" request (upload/simple-upload-file request)) 
    (mp/wrap-multipart-params 
    (POST "/upload-x"  request (upload/upload-file request)) 
    {:store upload/logging-store}) 
) 


(defroutes scratch-app 
    (context "/files" request file-list-routes) 
    (route/resources "/") 
    (route/not-found "Page not found")) 

(def my-app 
    (handler/site 
    (ring.middleware.json/wrap-json-response 
    (ring.middleware.json/wrap-json-params 
    (ring.middleware.stacktrace/wrap-stacktrace 
     (ring.middleware.session/wrap-session 
     scratch-app 
     {:store (ring.middleware.session.memory/memory-store all-the-sessions) 
     :cookie-attrs {:max-age 3600 ;in s 3600s = 1h 
         }})))))) 

(ring.util.servlet/defservice my-app) 

回答

6

compojure.handler/site函数包含中间件wrap-multipart-params,所以您不知不觉地将两部分中间件应用了两次:首先使用默认值,然后使用自定义选项。由于首先应用具有默认选项的多部件中间件,因此优先。

+0

Arg,我甚至去寻找类似的东西......没想到要去那里看看。看起来有些参数可以通过多部分参数(假设它们对于整个站点来说是相同的)。 – DrLivingston

+0

为什么首先应用默认的参数,这看起来有点儿内在? – DrLivingston