ClojureScript中的multipart / form-data支持

时间:2014-10-17 15:29:14

标签: clojurescript

如何在ClojureScript中提交multipart / formdata?有没有支持这个的库?我可以回到例如jquery.form.js但更喜欢简单的ClojureScript解决方案。

2 个答案:

答案 0 :(得分:3)

我最近向cljs-http发出拉取请求以支持表单数据。 Util r0man合并它,你可以在https://github.com/myguidingstar/cljs-http

的版本阅读器中查看说明

已编辑:拉取请求已合并。请改为查看原始存储库。

我就这样做了:

(defn generate-form-data [params]
  (let [form-data (js/FormData.)]
    (doseq [[k v] params]
      (.append form-data (name k) v))
    form-data))

(defn upload [file]
  (go (let [response (<! (http/post "http://localhost/upload"
                                    {:body (generate-form-data {:file file})}))]
        (prn (:status response))
        (prn (:body response)))))

;; some-dom-element is a single file upload input
;; <input type="file">
(upload (-> some-dom-element .-files first))

如果您不想使用cljs-http,请参阅其源代码中的cljs-http.core/request,了解如何直接拨打XhrIo https://github.com/r0man/cljs-http/blob/master/src/cljs_http/core.cljs

答案 1 :(得分:2)

看看cljs-http

;; Form parameters in a POST request (simple)
(http/post "http://example.com" {:form-params {:key1 "value1" :key2 "value2"}})

;; Form parameters in a POST request (array of values)
(http/post "http://example.com" {:form-params {:key1 [1 2 3] :key2 "value2"}})

======更新=======

你需要一些iframe黑客攻击。阅读thisthis

;; Imports
(:require [goog.events :as gev])
(:import [goog.net IframeIo]
         [goog.net EventType]

(defn upload []
  (let [io (IframeIo.)]
    (gev/listen io
                (aget goog.net.EventType "SUCCESS")
                #(js/alert "SUCCESS!"))
    (gev/listen io
                (aget goog.net.EventType "ERROR")
                #(js/alert "ERROR!"))
    (gev/listen io
                (aget goog.net.EventType "COMPLETE")
                #(js/alert "COMPLETE!"))
    (.setErrorChecker io #(not= "ok" (.getResponseText io)))
    (.sendFromForm io (dom/by-id "form") "/upload")))