如何在ClojureScript中提交multipart / formdata?有没有支持这个的库?我可以回到例如jquery.form.js
但更喜欢简单的ClojureScript解决方案。
答案 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"}})
======更新=======
;; 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")))