Как загрузить изображения через массив на сервер? - PullRequest
0 голосов
/ 04 января 2012

В моем приложении я должен загрузить несколько изображений на сервер, используя php.

Я делаю NSMutableArray * arrImages, который содержит мои изображения, выбранные из галереи.

предположим, что если я выберу два изображения и попытаюсь загрузить ..... я могу загрузить только одно изображение, которое выбрано последним .... я проверил цикл for ... он работает нормально ... но я не могу загрузить все два изображения ... пожалуйста, помогите мне.

следующий мой код:

- (IBAction)btnTakePicture_Clicked:(id)sender
{
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Select Image from..." delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Camera", @"Image Gallary", nil];
    actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
    actionSheet.alpha=0.90;
    actionSheet.tag = 1;
    [actionSheet showInView:self.view]; 
    [actionSheet release];
    UIButton *btn = (UIButton *)sender;
    intButton = btn.tag;
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    switch (actionSheet.tag) 
    {
        case 1:
            switch (buttonIndex)
        {
            case 0:
            {               
#if TARGET_IPHONE_SIMULATOR

                UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Message" message:@"Camera not available." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
                [alert show];
                [alert release];

#elif TARGET_OS_IPHONE  

                UIImagePickerController *picker = [[UIImagePickerController alloc] init];  
                picker.sourceType = UIImagePickerControllerSourceTypeCamera;  
                picker.delegate = self;  
                //picker.allowsEditing = YES;  
                [self presentModalViewController:picker animated:YES];
                [picker release];

#endif  
            }
                break;
            case 1:
            {
                UIImagePickerController *picker = [[UIImagePickerController alloc] init];  
                picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
                picker.delegate = self;  
                [self presentModalViewController:picker animated:YES];
                [picker release];
            }
                break;
        }
            break;

        default:
            break;
    }   
}


-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info
{
    NSData *dataImage = UIImageJPEGRepresentation([info objectForKey:@"UIImagePickerControllerOriginalImage"],1);
    UIImage *img = [[UIImage alloc] initWithData:dataImage];



    if (intButton == 0) 
    {

        imgView1.image=img;

    }
    else if (intButton == 1) 
    {
        imgView2.image=img;
    }
    else if (intButton == 2) 
    {
        imgView3.image=img;
    }
    else if (intButton == 3)
    {
        imgView4.image=img;

    }
    else if (intButton == 4)
    {
        imgView5.image=img;
    }
    else if (intButton == 5)
    {
        imgView6.image=img;
    }
    else if (intButton ==6)
    {
        imgView7.image=img;
    }
    else if (intButton ==7)
    {
        imgView8.image=img;
    }

    [arrImages addObject:dataImage];
    //NSLog(@"%@",dataImage);
    [picker dismissModalViewControllerAnimated:YES];
}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

    [self.navigationController dismissModalViewControllerAnimated:YES]; 
}

это мой код загрузки

-(IBAction)upload:(id)sender
{
    if ([arrImages count]>0) 
    {

        NSString *urlString = @"http://your url.com/upload/uploader.php";

        // setting up the request object now

        NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
        [request setURL:[NSURL URLWithString:urlString]];
        [request setHTTPMethod:@"POST"];


        NSString *boundary = [NSString stringWithString:@"---------------------------14737809831466499882746641449"];
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
        [request addValue:contentType forHTTPHeaderField: @"Content-Type"];


        NSMutableData *body = [NSMutableData data];





        for (int i = 0; i < [arrImages count]; i++)
        {

            //NSMutableData *body = [NSMutableData data];

            //[body appendData:[arrImages objectAtIndex:i] withFileName:@"image.jpg" andContentType:@"image/jpeg" forKey:[NSString stringWithFormat:@"image%d", i + 1]];


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

            [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"image%d.jpg\"\r\n",i + 1] dataUsingEncoding:NSUTF8StringEncoding]];

            [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];

            //[body appendData:[NSData dataWithData:imageData]];
            [body appendData:[arrImages objectAtIndex:i]];          
            [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
            // setting the body of the post to the reqeust

            //[request setHTTPBody:body];
        }
        [request setHTTPBody:body];

        NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];

        NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

        NSLog(@"%@",returnString);


    }

}

пожалуйста, помогите мне ... я пробую это из долгого времени ..

Ответы [ 4 ]

3 голосов
/ 04 января 2012

Хотя, вы НЕ ДОЛЖНЫ использовать массив для удержания вашего UIImages.У меня есть серьезные проблемы с производительностью с этим.Что вы должны сделать, это сохранить массив путей к изображениям, в тот момент, когда вы собираетесь загрузить изображение, просто используйте путь, чтобы получить изображение.В iPhone 4 с более чем 30 изображениями из галереи мое приложение начало сбой с предупреждениями о памяти.

Изменить (Фактический ответ на ваш вопрос):

Проблемазаключается в том, что перед отправкой нового запроса на загрузку следует дождаться ответа первого.Итак:

-> загрузка 1 -> WAIT -> загрузка завершена -> загрузка 2 -> WAIT -> загрузка завершена ...

Редактировать 2:

Димпл Панчал прав, вы должны делать это асинхронно.

1 голос
/ 04 января 2012

sendSynchronousRequest Плохо повлияет на вашу производительность, так как вы включаете изображения .. Также я не думаю, что вы должны добавлять границу каждый раз. Я не знаю, почему это не удается, но я думаю, что структура ваших данных для отправки не сформирована должным образом. Я не смог добавить комментарий, поэтому отбросил ответ :(

NSString *boundary = [NSString stringWithString:@"------------------------14737829899999999999999999999990"];
    [theRequest addValue:[NSString stringWithFormat:@"multipart/form-data;boundary=%@",boundary] forHTTPHeaderField:@"Content-Type"];
    [theRequest setHTTPMethod:@"POST"];
NSMutableData *body=[[NSMutableData alloc] init];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"xmldata\"\r\n\r\n %@\r\n\r\n",soapMessage] dataUsingEncoding:NSUTF8StringEncoding]];
[theRequest setHTTPBody:body];

Где мыло будет содержать ваши данные, как это петля

 {
  str =[str stringByAppendingString:@"<sampleRoot>"];
  str = [str stringByAppendingFormat:@"<imageDate>%@</imageData>", imgData];
  str =[str stringByAppendingString:@"</sampleRoot>"];

 }
NSString *soapMessage=str;  

Это просто логика, вам нужно будет изменить ее в соответствии с вашими требованиями.

Асинхронные соединения требуют немного больше кода, но все же относительно просты в реализации, для запуска соединения также требуется одна строка кода:

NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];

Затем нам нужно реализовать некоторые методы обратного вызова.

-(void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse*)response
{
  _data = [[NSMutableData alloc] init]; 
}
-(void)connection:(NSURLConnection*)connection didReceiveData:(NSData*)data
{
  [_data appendData:data];
}
-(void)connection:(NSURLConnection*)connection didFailWithError:(NSError*)error
{
  // Handle the error properly
}
-(void)connectionDidFinishLoading:(NSURLConnection*)connection
{
   // Deal with the data
}

Они не будут блокировать выполнение, как в synchronousRequest

0 голосов
/ 02 марта 2015

Это проблема с кодом, так как мы добавляем изображения в цикл, в котором сохраняется только последнее изображение, и каждый раз, когда предыдущее изображение переопределяется данными следующего изображения. Я использовал библиотеку AFNetworking для отправки нескольких изображений на сервер Это действительно круто и имеет все необходимое, чтобы сделать работу лучше и без ошибок.

0 голосов
/ 09 января 2015

Я думаю, что это проблема вашего веб-сервиса. Пожалуйста, проверьте ваш сервис и включите его для получения нескольких изображений. Спасибо за ваш код, я тоже столкнулся с той же проблемой, и теперь я надеюсь, что это работает.

...