我必须在项目中使用自定义的“多图像选择”第三方文件夹来选择图像,并且这些图像以阵列形式出现。自定义图像选择的链接是此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];