You are right! I didn't set the boundary in my client code. Thanks a lot!

在 2016年7月7日星期四 UTC+8下午12:46:04,James Reeves写道:
>
> By "application" I mean "Ring handler".
>
> Your request looks wrong. The boundary you set in your header 
> (------BoUnDaRyFFFFFF) doesn't match the boundary I see in the body 
> (--2n639DJeu...).
>
> - James
>
> On 7 July 2016 at 05:29, <aaartu...@gmail.com <javascript:>> wrote:
>
>> The request  header:
>>
>>
>>
>> <https://lh3.googleusercontent.com/-zl6jkFm15Pc/V33X-i2KFzI/AAAAAAAAAAM/c5zfE6Vn8qEHIZ3EInJed3HhKaFlFaINACLcB/s1600/%25E5%25B1%258F%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2016-07-07%2B12.11.55.png>
>>
>> The request body:
>>
>>
>> <https://lh3.googleusercontent.com/-1Kca-9uDPeI/V33Ye1MImfI/AAAAAAAAAAQ/SyACY6OPidcw8Z3s42XYKEu9OyGb6-HNQCLcB/s1600/%25E5%25B1%258F%25E5%25B9%2595%25E5%25BF%25AB%25E7%2585%25A7%2B2016-07-07%2B12.15.19.png>
>>
>> My test params are: 
>>
>> String[] tags = {"aaaa", "bbbb", "cccc"};
>> s = test.upload("/Users/apple/test.txt", tags, "19960808", 
>> "qwertyuiopasdfghjklzxcvbnm");
>>
>>
>> The content of test.txt is "This is a test...".
>>
>>
>> Is there anything wrong?
>>
>>
>> BTW, could you give me an example of the definition of app? I'm not sure 
>> which one is correct.
>>
>>
>> 在 2016年7月7日星期四 UTC+8上午10:30:31,James Reeves写道:
>>>
>>> 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, <aaartu...@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 clo...@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+u...@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+u...@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.

Reply via email to