将UIImage发送到HTTP服务器Objective C.

时间:2016-03-28 12:50:00

标签: ios objective-c http uiimage nsurlsession

我使用以下代码将图像发送到服务器HTTP:

-(NSDictionary*)sendImage:(UIImage*)image withDescription:(NSString*)description andTarget:(NSString*)target andTargetId:(int)targetId {
__block NSDictionary *result = nil;
NSData *imageData = UIImagePNGRepresentation(image);
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", PREFIX_URL_REQUEST, SEND_IMAGE]]];
[request setHTTPMethod:REQUEST_TYPE_POST];
NSString *boundary = [[NSString alloc] init];
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
[request addValue:contentType forHTTPHeaderField: @"Content-Type"];
NSMutableData *body = [NSMutableData data];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@.%d\"rn", target, targetId] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type: application/%@.png\r\n\r\n", [NSString stringWithFormat:@"%@_%d", target, targetId]] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[NSData dataWithData:imageData]];
[body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:body];
dispatch_semaphore_t sem = dispatch_semaphore_create(0);
NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
    result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
    NSLog(@"%@", result.description);
    dispatch_semaphore_signal(sem);
}];
[dataTask resume];
dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
return result;

}

这是服务器代码:

 session_start();
if ( isset($_SESSION['username']) ) {
    $params = explode(".", basename($_FILES["file"]["name"]));
    $target = array_values($params)[0];
    $id = array_values($params)[1];
    if ( ($target == "profile") || ($target == "question" && $_SESSION["waitingImagesQuestion"] > 0) || ($target == "answer" && $_SESSION["waitingImagesAnswer"] > 0) ) {
        $imageDirectory = "images/".round(microtime(true)*1000).".png";
        if ( move_uploaded_file($_FILES["file"]["tmp_name"], $imageDirectory) ) {
            switch ( $target ) {
                case "profile":
                    print JsonBuilder::putRecordProfileImage($imageDirectory);
                    return;
                case "answer":
                    $_SESSION["waitingImagesAnswer"] --;
                    print JsonBuilder::putRecordAnswerImage($imageDirectory, $id);
                    return;
                case "question":
                    $_SESSION["waitingImagesQuestion"] --;
                    print JsonBuilder::putRecordQuestionImage($imageDirectory, $id);
                    return;
            }
        } 
    }
} 
print JsonBuilder::getStringError();

有效,但只有当我调用客户端方法时才会这样([UIImage imageNamed:@"aaa.png"]):

[sender sendImage:[UIImage imageNamed:@"aaa.png"] withDescription:@"" andTarget:@"profile" andTargetId:1];

如果我使用UIImage调用该方法(例如从相机胶卷中拍摄的照片),那么:

-(void)sendImage:(UIImage*)image {
    return [sender sendImage:image withDescription:@"" andTarget:@"profile" andTargetId:1];
}

不起作用! 为什么呢?

由于

1 个答案:

答案 0 :(得分:0)

现在可行:

-(NSDictionary*)sendImage:(UIImage*)image withDescription:(NSString*)description andTarget:(NSString*)target andTargetId:(int)targetId {
if ( image != nil ) {
    NSData *imageData = UIImageJPEGRepresentation(image, 0.33f);
    __block NSDictionary *result = nil;
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@%@", PREFIX_URL_REQUEST, SEND_IMAGE]]];
    [request setHTTPMethod:REQUEST_TYPE_POST];
    NSString *boundary = @"0xKhTmLbOuNdArY";
    NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
    [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
    NSMutableData *body = [NSMutableData data];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@.%d\"rn", target, targetId] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Type: application/%@.png\r\n\r\n", [NSString stringWithFormat:@"%@_%d", target, targetId]] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[NSData dataWithData:imageData]];
    [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [request setHTTPBody:body];
    dispatch_semaphore_t sem = dispatch_semaphore_create(0);
    NSURLSessionDataTask *dataTask = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
        result = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
        dispatch_semaphore_signal(sem);
    }];
    [dataTask resume];
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER);
    return result;
}
return nil;
}