2015-06-30 240 views
7

下面是片斷上傳一個圖片file.I只想用NSURLSessionUploadTask,因爲它給了後臺上傳功能,我想在我的應用程序使用。NSURLSessionUploadTask上傳文件失敗

另外我想POST參數以及文件上傳。

而且我不是在服務器端好code.Can請人指導我什麼我做錯了什麼。

上傳代碼

NSString* filePath = [[NSBundle mainBundle] 
         pathForResource:@"sample" ofType:@"jpg"]; 
uint64_t bytesTotalForThisFile = [[[NSFileManager defaultManager] attributesOfItemAtPath:filePath error:NULL] fileSize]; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:uploadPath]; 
[request setHTTPMethod:@"POST"]; 
[request setValue:[NSString stringWithFormat:@"%llu", bytesTotalForThisFile] forHTTPHeaderField:@"Content-Length"]; 
[request setValue:@"application/octet-stream" forHTTPHeaderField:@"Content-Type"]; 

[request setTimeoutInterval:30]; 

NSString* filePath = [[NSBundle mainBundle] 
         pathForResource:@"sample" ofType:@"jpg"]; 


NSURLSessionUploadTask *taskUpload= [self.uploadSession uploadTaskWithRequest:request fromFile:[[NSURL alloc] initFileURLWithPath:filePath]]; 

PHP代碼

<?php 

$objFile = & $_FILES["file"]; 
$strPath = basename($objFile["name"]); 

if(move_uploaded_file($objFile["tmp_name"], $strPath)) { 
    print "The file " . $strPath . " has been uploaded."; 
} else { 
    print "There was an error uploading the file, please try again!"; 
} 

從服務器端我得到了$ _FILES

回答

0

空數組我會放的代碼的例子。檢查控制檯是否出現錯誤。

// 1. config 
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 

// 2. if necessary set your Authorization HTTP (example api) 
// [config setHTTPAdditionalHeaders:@{@"<setYourKey>":<value>}]; 

// 3. Finally, you create the NSURLSession using the above configuration. 
NSURLSession *session = [NSURLSession sessionWithConfiguration:config]; 

// 4. Set your Request URL 
NSURL *url = <yourURL>; 
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url]; 

// 5. Set your HTTPMethod POST or PUT 
[request setHTTPMethod:@"PUT"]; 

// 6. Encapsulate your file (supposse an image) 
UIImage *image = [UIImage imageNamed:@"imageName"]; 
NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 

// 7. You could try use uploadTaskWithRequest fromData 
NSURLSessionUploadTask *taskUpload = [session uploadTaskWithRequest:request fromData:imageData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

    NSHTTPURLResponse *httpResp = (NSHTTPURLResponse*) response; 
    if (!error && httpResp.statusCode == 200) { 

     // Uploaded 

    } else { 

     // alert for error saving/updating note 
     NSLog(@"ERROR: %@ AND HTTPREST ERROR : %ld", error, (long)httpResp.statusCode); 
     } 
}]; 
+0

我使用的背景會話不會違約,而且完成處理程序沒有在後臺session.Also NSData的允許作爲圖像是不允許的圖像。 – Mukesh

0

如果是完整的代碼,那麼你就不是真正開始上傳。 NSURLSession任務不會自動啓動(不像某些NSURLConnection調用)。你必須明確地調用他們的簡歷方法來開始上傳,否則任務就會坐在那裏,什麼都不做。

其次,您應該真的使用URLForResource而不是使用路徑,然後將其轉換爲URL。這不應該破壞你的代碼,但是使用URL開始的時候會更清晰。第三,如果你真的需要使用一個路徑,便利的方法(fileURLWithPath:)是你的朋友。第四,你不需要設置Content-Length和IIRC,你可能不應該這樣做,因爲如果NSURLSession協商了任何類型的編碼(例如,你不知道內容長度實際上會是什麼)。壓縮文件數據)。

第五,如果該文件是大的30秒可能不夠長。

第六,如果你在iOS或OS X的新版本運行,確保你要麼使用一個正確配置的HTTPS服務器或您已添加合適的應用傳輸安全例外。

最後,如果你想包括其他POST參數,而不是僅僅提供數據作爲請求體的一滴,你將不得不使用流式傳輸請求。當然,您可以簡單地使用GET參數,這就是我建議您的做法,因爲這是一種更簡單的方法。 :-)