The name of your form parameter is "foo", and it represents 2 uploads. apreq_body_get(req, "foo") will only return the first one tho. To get at them both you'll need to use the table API (eg apreq_body(req, &t)) and walk the table with a table_do function.
----- Original Message ---- > From: Mark Songhurst <m...@songhurst.org> > To: apreq-dev@httpd.apache.org > Sent: Tue, December 21, 2010 5:30:33 PM > Subject: How to use apreq_body_get ? > > Hello > > I'm very new to both Apache and libapreq; I'm struggling to get a C > based Apache module working with a multipart/form-data request, which > is uploading 2 files. > > Given these 2 parts in my request: > > Content-Disposition: form-data; name="foo"; filename="test_file_1.txt" > Content-Type: application/x-thought > > and > > Content-Disposition: form-data; name="foo"; filename="test_file_2.txt" > Content-Type: application/x-thought > > > Please could someone advise me what string I should place in the > second parameter in the call to apreq_body_get() ? > > I have tried using the actual filename "test_file_1.txt" but I get > returned a NULL pointer from apreq_body_get() > I've also tried using the string "filename" but this also gives me a > NULL pointer. > > At the end of this email I've appended the full request from my > client, and the handler from my Apache module. > > Thanks in advance for any help or suggestions. > > Kind regards, > Mark. > > > > Here is my multipart/form-data request, generated using the libcurl > curl_formadd function - please excuse the output, this is from my test > harness client (I can't figure out how to get Apache to dump the > entire request in it's logs): > > 12/21/10 21:19:42.402.177 HttpClient.cpp:174 DEBUG - > => Send header, 215 bytes (0xd7) > 0000: POST /thoughtupload HTTP/1.1 > 001e: Host: logger1.st3.devel.messagelabs.com > 0047: Accept: */* > 0054: Content-Length: 402 > 0069: Expect: 100-continue > 007f: Content-Type: multipart/form-data; boundary=-------------------- > 00bf: --------8691e9ee9b5b > 00d5: > > 12/21/10 21:19:42.403.968 HttpClient.cpp:174 DEBUG - > <= Recv header, 23 bytes (0x17) > 0000: HTTP/1.1 100 Continue > > 12/21/10 21:19:42.404.326 HttpClient.cpp:174 DEBUG - > => Send data, 155 bytes (0x9b) > 0000: ------------------------------8691e9ee9b5b > 002c: Content-Disposition: form-data; name="foo"; filename="test_file_ > 006c: 1.txt" > 0074: Content-Type: application/x-thought > 0099: > > 12/21/10 21:19:42.404.741 HttpClient.cpp:174 DEBUG - > => Send data, 21 bytes (0x15) > 0000: This is test file 1.. > > 12/21/10 21:19:42.405.059 HttpClient.cpp:174 DEBUG - > => Send data, 157 bytes (0x9d) > 0000: > 0002: ------------------------------8691e9ee9b5b > 002e: Content-Disposition: form-data; name="foo"; filename="test_file_ > 006e: 2.txt" > 0076: Content-Type: application/x-thought > 009b: > > 12/21/10 21:19:42.405.488 HttpClient.cpp:174 DEBUG - > => Send data, 21 bytes (0x15) > 0000: This is test file 2.. > > 12/21/10 21:19:42.405.740 HttpClient.cpp:174 DEBUG - > => Send data, 48 bytes (0x30) > 0000: > 0002: ------------------------------8691e9ee9b5b-- > > 12/21/10 21:19:42.444.345 HttpClient.cpp:174 DEBUG - > <= Recv header, 17 bytes (0x11) > 0000: HTTP/1.1 200 OK > > > The handler in my Apache module is as follows: > > static int thoughtupload_handler(request_rec *r) > { > if (strcmp(r->handler, "thoughtupload")) > { > return DECLINED; > } > > if(strncmp(r->method, "POST", 4) == 0) > { > apreq_handle_t *req; > req = apreq_handle_apache2(r); > > apr_pool_t *mp = NULL; > apr_pool_create(&mp, NULL); > ap_log_rerror(APLOG_MARK, APLOG_EMERG, APR_SUCCESS, r, "I have these > files: %s", apreq_params_as_string(mp, apreq_params(req, mp), NULL, > APREQ_JOIN_AS_IS)); > apr_pool_destroy(mp); > > apreq_param_t *param = apreq_body_get(req, "test_file_1.txt"); > > if(param == NULL) > { > ap_log_rerror(APLOG_MARK, APLOG_EMERG, APR_SUCCESS, r, "NO SUCH PARAM"); > } > else if(param->upload == NULL) > { > ap_log_rerror(APLOG_MARK, APLOG_EMERG, APR_SUCCESS, r, "NOT UPLOAD"); > } > else > { > ap_log_rerror(APLOG_MARK, APLOG_EMERG, APR_SUCCESS, r, "GOT SOME DATA!"); > } > } > > return OK; > } > > Using this code, I get the following log output: > > [Tue Dec 21 21:50:16 2010] [emerg] [client 10.191.84.1] I have these > files: test_file_1.txt, test_file_2.txt > [Tue Dec 21 21:50:16 2010] [emerg] [client 10.191.84.1] NO SUCH PARAM >