2014-03-04 72 views
3

之所以要你必須這樣做,是因爲我對params感到困惑。AFnetworking 2.2.0上傳服務器問題上的圖像

據我瞭解,有一種方法如何使用多部分請求來做到這一點。

這種方式爲我們提供了兩個概念,因爲我明白從文件上載可以存儲在Document目錄或使用NSData對象。從文件

上傳:

所以我一直保存到test.jpg放在文檔目錄。然後我讓NSURL實例在多部分請求中使用它。下面的代碼顯示瞭如何創建NSURL實例:

NSString *fileName = @"test.jpg"; 
NSString *folderPath = [documentsDirectory stringByAppendingPathComponent:fileName]; 
NSURL *filePath = [NSURL fileURLWithPath:folderPath]; 

當我打印文件路徑:

file:///Users/mac/Library/Application%20Support/iPhone%20Simulator/7.0.3/Applications/F732FCF6-EAEE-4E81-A88B-76ADB75EDFD1/Documents/test.jpg 

然後,我把我的參數和使用FORMDATA附加爲我下面的文件:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
NSDictionary *parameters = @{@"foo": @"bar"}; 
NSURL *filePath = [NSURL fileURLWithPath:@"file://path/to/image.png"]; 
[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    [formData appendPartWithFileURL:filePath name:@"image" error:nil]; 
} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"Success: %@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

這是正確的嗎?或者我錯過了某些東西,因爲迴應不成功?

第二個概念 - 直接處理數據:

[formData appendPartWithFileData:imageData name:@"image" fileName:@"test.jpg" mimeType:@"image/jpeg"]; 

但是,當應用程序調用這行代碼中,我得到了錯誤:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid parameter not satisfying: body' 

我假設的imageData定義之外的原因經理塊在這條線上是零。所以我需要幫助,以及如何將它傳遞給塊。

請你糾正我在我的步驟中有什麼問題,也許我錯過了一些東西。

而且當我評論線

[formData appendPartWithFileData:imageData name:@"image" fileName:@"test.jpg" mimeType:@"image/jpeg"]; 

[formData appendPartWithFileURL:filePath name:@"image" error:nil]; 

然後一切工作正常,我得到了重新運行成功響應。

+0

您的異常由AFNetworking內部的參數斷言觸發。但是,只有一些代碼行很難說明原因。請粘貼堆棧跟蹤。你確定'imageData'不是'nil'嗎?或者文件存在,它不是空的?一個斷點並進入AFNetworking代碼應該很快顯示出問題。 – Sulthan

+0

@Sulthan是的數據是零,但我把它傳入我的方法。但在經理塊imageData是零 –

+0

可以檢查這個問題,請http://stackoverflow.com/questions/33228903/uploading-image-with-afnetworking-with-null-parameter-doesnt-work/33229410?noredirect=1 #comment54313681_33229410 –

回答

6

您是否確認該文件位於您的Documents文件夾中的該位置?我也遇到了麻煩你的編程確定的文件路徑(這是正確的)與你的字符串文件路徑(這可能很容易出問題)。您應該總是以編程方式確定路徑,而不是使用字符串文字(因爲當您重新安裝應用程序時,該路徑將會更改)。我想你需要的是這樣的:

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; 
NSDictionary *parameters = @{@"foo": @"bar"}; 
NSString *documentsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"image.png"]; 
NSURL *fileURL = [NSURL fileURLWithPath:filePath]; 

[manager POST:@"http://example.com/resources.json" parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    NSError *error; 
    BOOL success = [formData appendPartWithFileURL:fileURL name:@"image" fileName:filePath mimeType:@"image/png" error:&error]; 
    if (!success) 
     NSLog(@"appendPartWithFileURL error: %@", error); 
} success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    NSLog(@"Success: %@", responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    NSLog(@"Error: %@", error); 
}]; 

注意,此編碼確定filePath(這是一個路徑,而不是URL),然後使用fileURLWithPath將其轉換成一個文件的URL。它還確認它是否成功,如果不成功則記錄錯誤。

另請注意,這假定您的服務器正在將其響應作爲JSON返回。如果沒有,你必須改變responseSerializer

+0

謝謝你在你的代碼中回答你有if(!success) NSLog(@「appendPartWithFileURL error:%@」,error);我已經通過它發佈了,並且成功變量總是TRUE。所以這意味着一切都很好。但是,響應是不好的,在服務器上定義了一些錯誤105 –

+0

謝謝你對我有用,我只是使用了絞線名稱參數在我的情況下,它是名稱playerImage而不是圖像的關鍵。 –

+0

可以檢查這個問題,請http://stackoverflow.com/questions/33228903/uploading-image-with-afnetworking-with-null-parameter-doesnt-work/33229410?noredirect=1#comment54313681_33229410 –