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

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


  -[__ NSDictionaryM CGImage]:无法识别的选择器已发送到实例0x60800024dce0
      2017-07-31 12:41:46.777 PK.House [7795:1224040] ***由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:
  '-[__ NSDictionaryM CGImage]:无法识别的选择器已发送到实例
  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];

10-08 05:44
查看更多