In all your examples except for possibly the last, you have the multipart middleware added twice over to your application.
Also, are you sure it's not a problem with your client code? One thing to try is recording your HTTP request by pointing your client at a netcat listener (e.g. "nc -l 3000"). Or writing a handler that dumps out the headers and the contents of the request body. - James On 7 July 2016 at 03:18, <aaarturoz...@gmail.com> wrote: > This is the link to the question in stackoverflow: > > http://stackoverflow.com/questions/38226276/cant-extract-multipart-params-from-post-request-in-compojure > > 在 2016年7月7日星期四 UTC+8上午10:13:25,aaartu...@gmail.com写道: > >> When I try to extract the multipart-params from a POST request like this: >> >> (defroutes upload-routes >> (POST "/upload" {params :params} (println params)) >> >> >> I got {}. >> >> Then I tried like this: >> >> (defroutes upload-routes >> (POST "/upload" {multipart-params :multipart-params} (println >> multipart-params)) >> >> I still got {}. >> >> I guess there are something wrong about my middleware. >> >> So I tried to change the handler, here are the handlers I had tried: >> >> (ns cloudserver.handler >> (:require [compojure.core :refer [defroutes routes]] >> [compojure.route :as route] >> [compojure.handler :as handler] >> [cloudserver.routes.home :refer [home-routes]] >> [noir.util.middleware :as noir-middleware] >> [cloudserver.routes.auth :refer [auth-routes]] >> [cloudserver.routes.upload :refer [upload-routes]] >> [cloudserver.routes.search :refer [search-routes]] >> [cloudserver.routes.download :refer [download-routes]] >> [ring.middleware.defaults :refer [api-defaults wrap-defaults >> site-defaults]] >> [ring.middleware.multipart-params :refer [wrap-multipart-params]] >> [ring.middleware.params :refer [wrap-params]] >> [noir.session :as session] >> [ring.middleware.session.memory :refer [memory-store]])) >> >> (def app >> (-> >> (routes auth-routes >> home-routes >> upload-routes >> search-routes >> download-routes >> app-routes) >> session/wrap-noir-session >> (wrap-defaults(assoc-in site-defaults [:security :anti-forgery] false) >> wrap-multipart-params >> wrap-params)) >> (def app >> (-> >> (routes auth-routes >> home-routes >> upload-routes >> search-routes >> download-routes >> app-routes) >> session/wrap-noir-session >> (wrap-defaults(assoc-in site-defaults [:security :anti-forgery] false) >> wrap-multipart-params)) >> (def app >> (-> >> (routes auth-routes >> home-routes >> upload-routes >> search-routes >> download-routes >> app-routes) >> session/wrap-noir-session >> (wrap-defaults (-> site-defaults >> (assoc-in [:security :anti-forgery] false) >> (assoc-in [:params :multipart] true) >> (assoc-in [:params :nested] true))) >> handler/site)) >> (def app >> (-> >> (routes auth-routes >> home-routes >> upload-routes >> search-routes >> download-routes >> app-routes) >> wrap-multipart-params >> session/wrap-noir-session >> (wrap-defaults(assoc-in site-defaults [:security :anti-forgery] false))) >> (def app >> (noir-middleware/app-handler >> [auth-routes >> home-routes >> upload-routes >> search-routes >> download-routes >> app-routes] >> :ring-defaults (assoc site-defaults :security nil))) >> >> But the only result I got is {} >> ------------------------------ >> >> My client code is: >> >> public int upload (String filename, String[] tags, String time, String >> fingerprint) throws IOException { >> String url = host + "/upload"; >> CloseableHttpClient httpClient = >> HttpClients.custom().setDefaultCookieStore(cookieStore).build(); >> HttpPost httpPost = new HttpPost(url); >> >> MultipartEntityBuilder mulentity = MultipartEntityBuilder.create(); >> >> mulentity.addBinaryBody("photo", new File(filename)); >> >> for (int i = 0; i < tags.length; i ++) { >> mulentity.addTextBody("tag" + i, tags[i]); >> } >> >> mulentity.addTextBody("fingerprint", fingerprint); >> mulentity.addTextBody("time", time); >> mulentity.addTextBody("filename", >> filename.substring(filename.lastIndexOf(File.separatorChar) + 1, >> filename.length())); >> >> HttpEntity entity = mulentity.build(); >> httpPost.setEntity(entity); >> httpPost.setHeader("Content-Type", "multipart/form-data;boundary=" + >> BOUNDARY); >> >> int status = 3; >> >> try { >> ResponseHandler<String> responseHandler = new BasicResponseHandler(); >> String response = httpClient.execute(httpPost, responseHandler); >> status = Integer.parseInt(response); >> } catch (ClientProtocolException e) { >> e.printStackTrace(); >> } catch (UnsupportedEncodingException e) { >> e.printStackTrace(); >> } finally { >> httpClient.close(); >> } >> return status; >> } >> >> ------------------------------ >> >> I am really a green hand in clojure web programming. Thanks a lot! >> > -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.