ios - 在 IOS 中将图像数组上传到服务器

标签 ios objective-c arrays image-uploading

我必须在我的项目中使用自定义多图像选择第三方文件夹来选择图像,并且这些图像以数组的形式出现。自定义图像选择的链接是这个 CreolePhotoSelection.

现在我正在尝试将图像数组上传到服务,但它给了我这个错误:

-[__NSDictionaryM CGImage]: unrecognized selector sent to instance 0x60800024dce0 2017-07-31 12:41:46.777 PK.House[7795:1224040] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryM CGImage]: unrecognized selector sent to instance 0x60800024dce0'

我上传图片的代码是,

-(void)submit
    {

        NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
        [dateFormat setDateFormat:@"yyyyMMddHHmmss"];
        NSDate *now = [[NSDate alloc] init];
        NSString *theDate = [dateFormat stringFromDate:now];
        NSLog(@"\n"
              "theDate: |%@| ", theDate);

       UIImage *image = [self.arrImages objectAtIndex:imagecount];
       imagecount++;


        NSData *imageData = [NSData dataWithData:UIImageJPEGRepresentation(image, 0.7f)];
        NSLog(@"Data is %@",imageData);

        NSString *baseurl = @"My URL";

        NSURL *dataURL = [NSURL URLWithString:baseurl];

        NSMutableURLRequest *dataRqst = [NSMutableURLRequest requestWithURL:dataURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];

        [dataRqst setHTTPMethod:@"POST"];

        NSString *stringBoundary = @"0xKhTmLbOuNdArY---This_Is_ThE_BoUnDaRyy---pqo";
        NSString *headerBoundary = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",stringBoundary];

        [dataRqst addValue:headerBoundary forHTTPHeaderField:@"Content-Type"];

        NSMutableData *postBody = [NSMutableData data];


        [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"image\"; filename=\"%@\"\r\n",[NSString stringWithFormat:@"%@.png",theDate]] dataUsingEncoding:NSUTF8StringEncoding]];
        [postBody appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
        [postBody appendData:imageData];
        [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

        [postBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [dataRqst setHTTPBody:postBody];

        NSHTTPURLResponse* response =[[NSHTTPURLResponse alloc] init];
        NSLog(@"Response is %@",response);
        NSError* error = nil ;
         NSLog(@"Error is %@",error);
        NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:dataRqst delegate:self];
         NSLog(@"Connection is %@",conn);
    }

    #pragma mark NSURLConnection Delegate Methods

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

        self.receiveData = [[NSMutableData alloc] init];
    }

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

        [self.receiveData appendData:data];


        NSError* error;

        NSDictionary* json = [NSJSONSerialization JSONObjectWithData:data

                                                             options:kNilOptions

                                                               error:&error];
        NSLog(@"json..%@",json);

        if (imagecount <[self.arrImages count]) {

           [self submit];
        }

       else
    {

            UIAlertView *alert=  [[UIAlertView alloc] initWithTitle:nil
                                                           message:@"Data uploaded successfully"
                                                          delegate:nil

                                                  cancelButtonTitle:nil

                                                otherButtonTitles:nil, nil] ;
            [alert show];
        }

    }

    - (NSCachedURLResponse *)connection:(NSURLConnection *)connection
                      willCacheResponse:(NSCachedURLResponse*)cachedResponse {

        return nil;
    }

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    }

    -(void)connection:(NSURLConnection *)connection didSendBodyData:

    (NSInteger)bytesWritten totalBytesWritten:(NSInteger)totalBytesWritten 

    totalBytesExpectedToWrite:(NSInteger)totalBytesExpectedToWrite
    {

    }

我选择的图片代码是这样的:

    - (IBAction)Select:(id)sender 
    {
    CreolePhotoSelection *objCreolePhotoSelection= [[CreolePhotoSelection alloc] initWithNibName:@"CreolePhotoSelection" bundle:nil];
    objCreolePhotoSelection.strTitle = @"Images";
    objCreolePhotoSelection.delegate = self; // It will help to retrive all selected photos from CreolePhotoSelection
    objCreolePhotoSelection.arySelectedPhoto = _arrImages; // You need to pass same array which is holding selected image
    objCreolePhotoSelection.maxCount = 50; // Eg. 5, 10 anythings...

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:objCreolePhotoSelection];
    [self.navigationController presentViewController:navController animated:YES completion:nil];

}

函数是这些:

    -(void)getSelectedPhoto:(NSMutableArray *)aryPhoto

{
    //    //Initlize array

    //    NSArray *aryAlImage = [aryPhoto valueForKeyPath:@"mainImage"];

    //

    //    NSMutableArray *ary = [[NSMutableArray alloc] initWithArray:aryAlImage];

    _arrImages = nil;

    _arrImages = [NSMutableArray new];

    _arrImages = [aryPhoto mutableCopy]; //mainImage, Asset, selected

    [self setImageToScrollview:_arrImages];

}

#pragma mark - Display Image to ScrollView
-(void)setImageToScrollview:(NSMutableArray *)arrSetImage

{
    // Remove all images from ScrollView and then add new one

    for(id sender in _scrImageDisplay.subviews)

        [sender removeFromSuperview];

    _scrImageDisplay.pagingEnabled = FALSE;

    CGFloat height_width = CGRectGetHeight(_scrImageDisplay.frame);

    NSInteger numberOfImages = arrSetImage.count;


    NSLog(@"Size of array is %ld",(long)numberOfImages);

    CGFloat xOrigin = 0;

    for (int i = 0 ; i < numberOfImages ; i++)

    {
        xOrigin += 3;

        CGRect rect =  CGRectMake(xOrigin, 0,height_width,height_width);

        UIImageView *Arrimage = [[UIImageView alloc] initWithFrame:rect];

        Arrimage.image = [[arrSetImage objectAtIndex:i] valueForKey:@"mainImage"];

        NSLog(@"Image data is %@",Arrimage);

        Arrimage.contentMode = UIViewContentModeScaleAspectFill;

        Arrimage.clipsToBounds = YES;

        [_scrImageDisplay addSubview:Arrimage];

        xOrigin += height_width;

    }

    _scrImageDisplay.contentSize = CGSizeMake(xOrigin, height_width);
}

最佳答案

您可以使用NSURLSession 来执行图片上传任务。这是代码。

NSDictionary *headers = @{ @"content-type": @"application/json",
                           @"cache-control": @"no-cache",
                           };
NSDictionary *parameters = @[ @{ @"image": @“BASE_64_STRING”, @"proeprty_id": @"1", @"name": @"asd.png" } ];

NSData *postData = [NSJSONSerialization dataWithJSONObject:parameters options:0 error:nil];

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:YOUR_SERIVCE_URL]
                                                       cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                   timeoutInterval:10.0];
[request setHTTPMethod:@"POST"];
[request setAllHTTPHeaderFields:headers];
[request setHTTPBody:postData];

NSURLSession *session = [NSURLSession sharedSession];
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request
                                            completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
                                                if (error) {
                                                    NSLog(@"%@", error);
                                                } else {
                                                    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *) response;
                                                    NSLog(@"%@", httpResponse);
                                                }
                                            }];
[dataTask resume];

关于ios - 在 IOS 中将图像数组上传到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45411778/

相关文章:

iphone - UICollectionView:像 Safari 选项卡或 App Store 搜索一样的分页

ios - AFHTTPSessionManager 设置授权 header

ios - 旋转UIImage并移动

ios - 如何使用 AFNetworking 2.0 将包含字典的数组发送到服务器?

java - 数组忽略 Null 作为值

ios - 迅速丰富的通知。图片未显示在通知中

Objective-c 异步内存管理

objective-c - 将 subview Controller 推到 UINavigationController 后崩溃

javascript - 使用 Parse 更正 for 循环中的顺序

c++ - 将多个函数存储到数组 C++ 中以进行循环