3

Hello I am trying to upload Image From my IOS device to server.

And Here Is my code to upload the Image

- (IBAction)btnUpload:(id)sender {

    if (self.imageViewGallery.image == nil) {
        UIAlertView *ErrorAlert = [[UIAlertView alloc] initWithTitle:@"Wait"
                                                             message:@"Please Select An Image To Upload." delegate:nil
                                                   cancelButtonTitle:@"OK"
                                                   otherButtonTitles:nil, nil];
        [ErrorAlert show];
        NSLog(@"error");
    }
    else{
    NSData *imageData = UIImageJPEGRepresentation(self.imageViewGallery.image, 90);
    NSString *urlString = @"http://localhost/ColorPicker/api.upload.php";


    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:urlString]];

    [request setHTTPMethod:@"POST"];
    NSString *boundary = @"---------------------------14737809831466499882746641449";
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
        NSString *imgName = LIbraryImage;
        NSLog(@"image name : %@",imgName);

    NSMutableData *body = [NSMutableData data];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

        [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"files\"; filename=\"%@\"\r\n", imgName]] dataUsingEncoding:NSUTF8StringEncoding]];

    [body appendData:[@"Content-Type: application/octet-stream\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:imageData]];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];

    [request setHTTPBody:body];
        NSLog(@"setRequest : %@", request);


    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

    NSLog(@"returnstring is : %@",returnString);
    }

Now here is my server side code. It is a bit long.

  <?php

$Image = $_FILES['files']['name'];
    print_r($_FILES);
foreach ($Image as $f => $name) {

    $allowedExts = array("gif", "jpeg", "jpg", "png");
    $temp = explode(".", $name);
    $extension = end($temp);

    if ((($_FILES['files']['type'][$f] == "image/gif") || ($_FILES['files']['type'][$f] == "image/jpeg") || ($_FILES['files']['type'][$f] == "image/jpg") || ($_FILES['files']['type'][$f] == "image/png")) && ($_FILES['files']['size'][$f] < 2000000) && in_array($extension, $allowedExts)) {
        if ($_FILES['files']['error'][$f] > 0) {
            echo "Return Code: " . $_FILES['files']['error'][$f] . "<br>";
        } else {

            if (file_exists("upload/" . $name)) {

            } else {
                move_uploaded_file($_FILES['files']['tmp_name'][$f], 'upload/' . uniqid() . "_" . $name);
            }
        }
    } else {
        $error = "Invalid file";
    }

}
?>

Now what happen every time I try to upload got this warning

<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/Applications/XAMPP/xamppfiles/htdocs/ColorPicker/uploadAction.php</b> on line <b>5</b><br />
6
  • Which else block is running in your PHP? The "No POST" one or the "error" one? Commented Jan 1, 2014 at 14:59
  • NO POST all the time... Commented Jan 1, 2014 at 15:02
  • 1
    What's the output from the print_r($_FILES)? Commented Jan 3, 2014 at 20:23
  • Please post the output of print_r($_FILES). Commented Jan 3, 2014 at 20:28
  • ye sir it is returning following array Array ( [files] => Array ( [name] => iphone.jpg [type] => application/octet-stream [tmp_name] => /Applications/XAMPP/xamppfiles/temp/php4VsKOv [error] => 0 [size] => 13484 ) ) Commented Jan 3, 2014 at 21:15

2 Answers 2

2

From the comments, that print_r is returning:

Array ( 
    [files] => Array ( 
        [name] => iphone.jpg 
        [type] => application/octet-stream 
        [tmp_name] => /Applications/XAMPP/xamppfiles/temp/php4VsKOv 
        [error] => 0 
        [size] => 13484 
    )
) 

Meanwhile, your code is doing this:

$Image = $_FILES['files']['name'];
print_r($_FILES);
foreach ($Image as $f => $name) {

You're treating $_FILES['files']['name'] as if it's an array, when it isn't. That's why PHP says "Invalid argument supplied for foreach()"

Please note that it can become an array if multiple files are uploaded with the same form element name. This is by far the most infuriating thing about $_FILES.

Your uploading code does not attempt to use the PHP syntax needed to upload multiple files at once, so your PHP code does not need to worry about the content of the inner array being arrays themselves. You can eliminate the foreach loop and all references to the [$f] index.

Sign up to request clarification or add additional context in comments.

Comments

1

When you upload image data as multipart, it end up in $_FILES. Since PHP 4.3.0, $_REQUEST no longer contains any information about files uploaded in this manner.

The rest of your code is based around the idea of the image not being uploaded as multipart but instead being uploaded as a base-64 string in a standard form. Instead of writing base 64 data to a file, you will simply need to get the information about the file from $_FILES and move it to your target directory with move_uploaded_file.

2 Comments

Yep. Validate that the file was uploaded with print_r($_FILES), then rewrite the PHP.
Sir I have done some changes could you please help me with that.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.