1

NSURLSessionUploadTask을 사용하는 iOS 앱에 비디오 업로드 시스템이 있습니다. 비디오 파일은 내가 내 업로드 방법에 다음 코드를 사용하고 NSURL에 저장됩니다NSURLSessionUploadTask를 사용하여 PHP 서버에 파일 업로드

request.HTTPMethod = @"POST"; 
[request addValue:@"file" forHTTPHeaderField:@"fileName"]; 

// Create upload task 
NSURLSessionUploadTask *task = [session uploadTaskWithRequest:request fromFile:filePath completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 
    if(!error) { 
     // handle success 
    } else { 
     // handle error 
    } 
}]; 

// Run the task 
[task resume]; 

내가이 업로드를 처리 할 수의 nginx에서 실행 (Laravel를 사용하여) PHP의 서버가 있습니다. Postman과 함께 테스트 해 보았고 업로드 (파일 "file"이라는 이름의 파일을 기다리는)를 허용합니다.

위의 objc 코드를 실행하면 서버에 업로드 된 파일이 없음 ($_FILES 배열이 비어 있음)입니다.

"fileName"헤더를 설정하지 않고 시도했지만 "multipart/form-data"로 "Content-Type"설정을 시도했지만이 중 아무 것도 작동하지 않았습니다.

NSURLSessionUploadTask을 올바르게 (NSURL에서) 서버로 업로드하려면 어떻게해야합니까? NSURLSessionUploadTask not passing file to php script

+0

파일에 무엇이 있습니까? PHP는 몸체가 [폼 기반 파일 업로드] (http://stackoverflow.com/questions/8659808/how-does-http-file-upload-work)처럼 보이기를 기대할 것이며, uploadTaskWithRequest doesn 무엇이든 "똑똑한"일을하지 마십시오. 단지 파일을 본문 데이터로 보냅니다. –

+0

.mov 파일입니다. – GTF

+0

AFNetworking을 사용하고 auth 헤더를 "수동으로"작성하여 인증 문제를 해결함으로써이 문제를 해결했습니다 (base64 인코딩 등). – GTF

답변

8

NSURLSessionUploadTask 이용하여 uploadTaskWithRequest : FROMFILE을 : 같이, 이진 파일로 요청 본문으로 전송

이 포스트 상세 유사한 문제점을 보인다.

PHP로 파일을 저장하려면 요청 본문을 가져 와서 파일로 저장하면됩니다.

명백히 일종의 파일 형식 유효성 검사를하는 것이 가장 좋습니다.

목표 - C 코드 :

// Define the Paths 
NSURL *URL = [NSURL URLWithString:kDestinationURL]; 

// Create the Request 
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:URL]; 
[request setHTTPMethod:@"POST"]; 

// Configure the NSURL Session 
NSURLSessionConfiguration *config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:@"com.upload"]; 
config.HTTPMaximumConnectionsPerHost = 1; 
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; 

// Define the Upload task 
NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request fromFile:audioRecorder.url]; 

// Run it! 
[uploadTask resume]; 

PHP 코드 : https://github.com/gingofthesouth/Audio-Recording-Playback-and-Upload

: 여기 서버에 업로드 코드 기록 오디오의 예와 쓴

<?php 
    // File Path to save file 
    $file = 'uploads/recording.m4v'; 

    // Get the Request body 
    $request_body = @file_get_contents('php://input'); 

    // Get some information on the file 
    $file_info = new finfo(FILEINFO_MIME); 

    // Extract the mime type 
    $mime_type = $file_info->buffer($request_body); 

    // Logic to deal with the type returned 
    switch($mime_type) 
    { 
     case "video/mp4; charset=binary": 

      // Write the request body to file 
      file_put_contents($file, $request_body); 

      break; 

     default: 
      // Handle wrong file type here 
    } 
?> 

도움이 되었기를 바랍니다.

+0

AFNetworking을 사용하여 그 주위에 방법을 발견 했으므로이를 테스트 할 수는 없지만 나중에 참조 할 때 감사합니다. 감사합니다. – GTF

+0

우리는이 매개 변수도 게시 할 수 있습니까? 왜냐하면 나는 게시하려고하지만 didnt 성공을 발견했습니다. – Mukesh