2016-03-28 4 views
0

шлю изображение на сервер HTTP с этим кодом:отправить UIImage на HTTP сервер Objective C

-(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]; 
} 

не работает! Почему?

Благодаря

+0

вопрос довольно абстрактно. требуется дополнительная информация. консоль Xcode debug создает какой-либо вывод? Создает ли журнал ошибок сервера какой-либо вывод? Прежде всего вам нужно понять, выполняется ли HTTP-запрос вообще или нет. – heximal

+0

код работает, но только если я даю методу (отправить изображение) изображение так: [UIImage imageNamed: @ "aaa.png"], когда я даю методу UIImage, извлеченному из ролика камеры, не Работа! @heximal –

+0

Вы уверены, что изображение не нуль в тот момент? – heximal

ответ

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; 
} 
Смежные вопросы