1

현재 프로젝트에서 특정 데이터를 수집하여 사용자 요청에 의해 백엔드 서버로 전송하는 UITableViewController을 구현했습니다. 이 모든 것이 훌륭하게 멋지게 작동합니다. 그러나 이미지를 업로드하는 데 문제가 있습니다.UIImagePickerController에서 ASIFormDataRequest를 사용하여 PHP 서버로 보내기

UIImagePickerController 이미지를 얻고 보내면 서버에 문제가있는 것 같습니다. 만약 JPEG로 인코딩한다면, PHP는 그것을 이해하지 못하는 것 같습니다. PNG로 인코딩하면 전체 요청이 엉망이 될 것 같습니다.

그러나 프로젝트에있는 다른 이미지 (예 : 일부 배경 이미지)를 선택하면 업로드 프로세스가 완벽하게 작동합니다. 그것은 이상한 부분입니다. 최대한 빨리 UIImagePickerController에서 이미지를 사용하여, 그것은 작동하지 않습니다 ... 비록 내가 이미지를 얻을 않습니다 (코드에서 addSubview 참조) 작동합니다.

내 코드입니다 :

@interface ServiceViewController() 

@property (nonatomic) UIImage *image; 
[...] 

@end 

@implementation ServiceViewController 

@synthesize image = _image; 
[...] 

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 
{ 
    self.image = [[info objectForKey:UIImagePickerControllerOriginalImage] copy]; 

    [self.tableView reloadData]; 

    [self dismissModalViewControllerAnimated:YES]; 
} 

- (void)sendToApi 
{ 
    // Send post data 
    NSString *urlString = [NSString stringWithFormat:@"%@/%@", API_BASE_DOMAIN2, @"requestservice"]; 
    urlString = @"http://localhost/api/public_html/requestservice"; 

    NSURL *url = [NSURL URLWithString:urlString]; 

    ASIFormDataRequest *request = [[ASIFormDataRequest alloc] initWithURL:url]; 
    [request setUseKeychainPersistence:YES]; 
    [request setPostValue:[self.problems objectAtIndex:self.problem] forKey:@"problem"]; 
    [request setPostValue:[self stationName] forKey:@"station"]; 
    [request setPostValue:self.otherInformation forKey:@"information"]; 
    [request setPostValue:[NSNumber numberWithInt:self.lock] forKey:@"lock"]; 
    [request setUploadProgressDelegate:self]; 
    [request setDidFinishSelector:@selector(didCompleteRequestService:)]; 
    [request setDidFailSelector:@selector(processFailed:)]; 
    [request setDelegate:self]; 
    [request setRequestMethod:@"POST"]; 

    // Upload an image 
    [request addData:[NSData dataWithData:UIImageJPEGRepresentation(self.image, 0.9)] withFileName:@"img.jpg" andContentType:@"image/jpeg" forKey:@"picture"]; 


    UIImageView *view = [[UIImageView alloc] initWithImage:self.image]; 
    [view sizeToFit]; 
    [self.view addSubview:view]; 

    [request startAsynchronous]; 
} 

- (void)setProgress:(float)newProgress { 
// [prgressView setProgress:newProgress]; 
    NSLog(@"New progress: %f", newProgress); 
} 

- (void)didCompleteRequestService:(ASIHTTPRequest *)request 
{ 
    NSLog(@"Request completed"); 
    NSLog(@"Result: %@", request.responseString); 
} 

서버 측 : 나는 다음과 같은 여러 가지의 무리를 시도

2013-03-21 00:04:04.859 AppName[15598:c07] New progress: 0.000000 
2013-03-21 00:04:04.862 AppName[15598:c07] New progress: 1.000000 
2013-03-21 00:04:04.863 AppName[15598:c07] Request completed 
2013-03-21 00:04:04.863 AppName[15598:c07] Result: array(1) { 
    ["picture"]=> 
    array(5) { 
    ["name"]=> 
    string(7) "img.jpg" 
    ["type"]=> 
    string(0) "" 
    ["tmp_name"]=> 
    string(0) "" 
    ["error"]=> 
    int(1) 
    ["size"]=> 
    int(0) 
    } 
} 
array(5) { 
    ["name"]=> 
    string(7) "img.jpg" 
    ["type"]=> 
    string(0) "" 
    ["tmp_name"]=> 
    string(0) "" 
    ["error"]=> 
    int(1) 
    ["size"]=> 
    int(0) 
} 
string(58) "/Users/paulp/Sites/api/service/K98XQPo7zx.jpg" 
Sending error: 500 

: 이것은 내 결과입니다

var_dump($_FILES); 

    if ($this->_aPicture !== null) { 
     $sTarget = DIR_SERVICE . $this->_sFileNamePrefix . ".jpg"; 

     var_dump($this->_aPicture); 
     var_dump($sTarget); 

     if (!move_uploaded_file($this->_aPicture['tmp_name'], $sTarget)) { 
      $this->returnHttpError(500); 
     } 
    } 

    $this->_writeDataToFile(); 

:

예를 들어 변경하지 않았습니다. MKNetworkKit은 (아직) 시간이나 예산이 없기 때문에 해결책이 아닙니다.

이 문제를 어떻게 해결할 수 있습니까?

답변

1

결국, 내 전 코드는 완벽하게 작동했습니다 ... 그것은 내 PHP 설정이 잘못된 것으로 판명되었습니다. 내 php.ini 파일에서 구성 값 upload_max_filesize이 기본값 2M으로 설정되었습니다. 200M으로 변경 한 후 완벽하게 작동했습니다.

0

이 코드를 시도, 나를 위해 완벽하게 작동합니다

[request addData:UIImagePNGRepresentation(image) withFileName:@"image.png" andContentType:@"multipart/form-data" forKey:@"image"]; 
+0

위에서 언급했듯이 PNG 표현은 어떤 이유로 든 전체 양식을 망가 뜨립니다. 그것을 사용하여, PHP는 결국 POST 데이터를 수신하지 않는 것 같습니다. –

+0

서버 측 프로그래머에게 물어 보겠습니다. – iiFreeman

+1

맨 위에 쓰여 있듯이 upload_max_filesize 제한과 관련된 문제가 발생합니다. 오류 = 1은 다음을 의미합니다. "업로드 된 파일이 php.ini의 upload_max_filesize 지시문을 초과합니다." 이 설정의 기본값은 2M입니다. 2M을 더 업로드하려고합니다. php.ini 파일을 편집하고 php (또는 아파치를 사용한다면)를 다시 시작하십시오. – Karisters

2

저장

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)img editingInfo:(NSDictionary *)editInfo { 

    //Save selected image to document directory 
    jpgPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Test.jpg"]; 
    [UIImageJPEGRepresentation(img, 1.0) writeToFile:jpgPath atomically:YES]; 
    [picker dismissModalViewControllerAnimated:YES]; 
} 

다음 ASIFormDataRequestsetFile:forKey 방법은 서버에 이미지를 전송하는 데 사용하는 선택한 이미지

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url]; 
if (jpgPath.length > 0) { 
    [request setFile:jpgPath forKey:@"image"]; 
} 
+0

그나저나 나쁜 생각은 아니지만, 오늘은 조금 나중에 설명 드리겠습니다. thnx –

+0

시도해보십시오. 같은 문제가 있습니다. –

+1

문제점을 발견했습니다 ... PHP 설정. 'upload_max_filesize'는 2M으로 설정되었고 파일은 5M이었습니다. 그걸 알아 내는데 4 시간이나 걸렸어. ( –

관련 문제