ring form 上传文件

最近需要form表单提交文件,text复合内容(即multipart/form-data),首先添加其中间件wrap-multipart-params函数,github Wiki上有写,加入之后会发现request 多了个multipart-params的K-V对
例如 :multipart-params {“user” “kimmy”, “up” {:size 261556, :tempfile #, :content-type “image/jpeg”, :filename “A{@D}%])VN6)QCF0}}QM(CI.jpg”}}。
——————————-说点别的————————-
1.如果用的是Compojure,这样获取request

(POST "/upload" request
		(println request))

2.用我写的这个csp-compiler调试很方便,可以直接像jsp调试java代码一样 实时调试输出clj改动响应结果(得瑟一下)
—————————————————————

回到正题,如果用官方的这样得到的:multipart-params,是使用默认的临时文件保存方法,其功能就是把文件们写到临时文件下,并且开启后台线程检测超过某个过期时间,就会删除其。
但是我现在的需求是永久的保存,并且不想浪费这个资源去开线程检测它有没有过期,默认方法是做不到的(它只能传入过期时间的参数,线程照开),所以找到代码

(defn multipart-params-request
  "Adds :multipart-params and :params keys to request.
  See: wrap-multipart-params."
  {:arglists '([request] [request options])
   :added "1.2"}
  [request & [options]]
  (let [store    (or (:store options) @default-store)
        encoding (or (:encoding options)
                     (req/character-encoding request)
                     "UTF-8")
        params   (if (multipart-form? request)
                   (parse-multipart-params request encoding store)
                   {})]
    (merge-with merge request
                {:multipart-params params}
                {:params params})))

核心代码如上,如果想自己写的话,就把函数作为:store的值塞到一个option的map里面,然后改下middleware的参数,这里的upload/file-store参照默认函数temp_file.clj改写的

(-> routes
      wrap-keyword-params
      wrap-nested-params
      wrap-params
      (wrap-multipart-params {:store (upload/file-store)} ))

最后注意,改写的函数是个闭包函数,执行后才返回一个干正事的函数。