Note that there are some explanatory texts on larger screens.

plurals
  1. PORetrieve HTTP POST variables using multipart/form-data sent from an iOS device
    text
    copied!<p>I need to retrieve the POST variables being sent from my iOS application, but so far I have had no luck. Here is some background:</p> <p>I have an iOS application that posts an image along with some variables to a php page that simply saves the variables in a file (for debugging) and moves the image to the current directory (server side). I can get a handle on the image without issue using the $_FILE variable, however I cannot seem to get any of the POST parameters at all.</p> <p>Some general info and what I've tried:</p> <ul> <li>Tried getting post variables with $_POST, then dumped $_POST...it was empty</li> <li>Tried dumping $HTTP_RAW_POST_DATA (though <a href="http://www.php.net/manual/en/ini.core.php#ini.always-populate-raw-post-data" rel="nofollow noreferrer">this page</a> says it's not populated when using multipart/form-data)</li> <li>Checked the "post_max_size" variable (it's 8MB, I'm sending in the KB range) after seeing <a href="https://stackoverflow.com/questions/1075513/php-parsing-multipart-form-data">this post</a></li> <li>Used wireshark to verify that the variables are indeed being received by the server</li> </ul> <p>I'm using modified sample code <a href="https://stackoverflow.com/questions/8564833/ios-upload-image-and-text-using-http-post?answertab=votes#tab-top">from here</a></p> <pre><code>// create request NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init]; [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData]; [request setHTTPShouldHandleCookies:NO]; [request setTimeoutInterval:30]; [request setHTTPMethod:@"POST"]; NSMutableDictionary* _params = [[NSMutableDictionary alloc] init]; [_params setObject:@"1.0" forKey:@"ver"]; [_params setObject:@"en" forKey:@"lan"]; [_params setObject:[NSString stringWithFormat:@"%@", @"myUserName"] forKey:@"userId"]; // the boundary string : a random string, that will not repeat in post data, to separate post data fields. NSString *BoundaryConstant = @"V2ymHFg03ehbqgZCaKO6jy"; // string constant for the post parameter 'file' NSString *FileParamConstant = @"media"; //Setup request URL NSURL *requestURL = [[NSURL alloc] initWithString:@"http://myWebAddress/myAction.php"]; // set Content-Type in HTTP header NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BoundaryConstant]; [request setValue:contentType forHTTPHeaderField: @"Content-Type"]; // post body NSMutableData *body = [NSMutableData data]; // add params (all params are strings) for (NSString *param in _params) { [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"%@\r\n", [_params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]]; } // add image data NSData *imageData = UIImageJPEGRepresentation([self.imageButtonOutlet backgroundImageForState:UIControlStateNormal], 1.0); if (imageData) { printf("appending image data\n"); [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\'%@\'; filename=\"image.jpg\"\r\n", FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]]; [body appendData:imageData]; [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]]; } [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]]; // setting the body of the post to the reqeust [request setHTTPBody:body]; // set the content-length NSString *postLength = [NSString stringWithFormat:@"%d", [body length]]; [request setValue:postLength forHTTPHeaderField:@"Content-Length"]; // set URL [request setURL:requestURL]; NSURLConnection *postConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; [postConnection start]; [postConnection release]; </code></pre> <p>Also, here is myAction.php, as it stands right now:</p> <pre><code>&lt;?php $fp_file = fopen("./output_files.txt", "w"); $fp_post = fopen("./output_post.txt", "w"); $post_content = var_export($_POST , TRUE); $file_content = var_export($_FILES, TRUE); fwrite($fp_file, $file_content); fwrite($fp_post, $post_content); fclose($fp_file); fclose($fp_post); move_uploaded_file( $_FILES['media']['tmp_name'], "test.jpg"); ?&gt; </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload