0

我想通過AFNetworking使用NSURLSessionUploadTask通過多部分請求上傳文件。該請求執行並接收來自服務器的響應,但服務器未接收到表單中的數據。服務器沒有收到來自NSURLSessionUploadTask的數據

iOS的代碼

NSString *urlString = [[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString]; 
NSError *error = nil; 

NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:urlString parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    // 
    [formData appendPartWithFileData:[NSData dataWithContentsOfURL:[NSURL fileURLWithPath:path]] 
           name:@"video" 
          fileName:[path lastPathComponent] 
          mimeType:@"video/mp4"]; 
} error:&error]; 

if ([account isAuthenticated]) {; 
    NSString *authHeader = [NSString stringWithFormat:@"Bearer %@", account.accessToken]; 
    [request setAllHTTPHeaderFields:@{@"Authorization": authHeader}]; 
} 

NSURLSessionUploadTask *task = [self uploadTaskWithStreamedRequest:request progress:progress completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) { 
    if (error) { 

    } else { 

    } 
}]; 
[task resume]; 

下面是從AFNetworkingActivityLogger請求的頭信息:

POST 'http://127.0.0.1:8000/upload/': { 
"Accept-Language" = "en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5"; 
Authorization = "Bearer 270f985de7ebf0aa49b7ff1cad8377e007141f94"; 
"Content-Length" = 225974; 
"Content-Type" = "multipart/form-data; boundary=Boundary+4597B504492E1006"; 
"User-Agent" = "Test/1.0 (iPad Simulator; iOS 7.1; Scale/1.00)"; 
} (null) 

我使用Django在服務器端。這裏的測試觀點:

class UploadView(View): 

def post(self, request, *args, **kwargs): 
    logger.debug("FILES: {0} | DATA: {1}".format(request.FILES, request.POST)) 
    return HttpResponse(content=json.dumps({"test": "2"}), content_type='application/json') 

但是這兩個文件和POST對象是空的:

FILES: <MultiValueDict: {}> | DATA: <QueryDict: {}> 

此作品,未經多請求 - 只發送不帶文件POST請求上傳的QueryDict填充。我不確定的一件事是根據AFNetworkingActivityLogger輸出,請求的主體是「(null)」。

任何幫助表示讚賞!我很難過。

回答

1

從文檔的 - [NSURLSession uploadTaskWithStreamedRequest:(貌似這是你使用的是什麼):

...在這個請求對象 體流和身體數據被忽略,NSURLSession調用其代理的 URLSession:task:needNewBodyStream:方法來提供正文數據。

您是否實現了該委託方法?

https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSURLSession_class/Introduction/Introduction.html#//apple_ref/doc/uid/TP40013435-CH1-SW28

+0

Ack-RTFM在我的部分失敗 - 這的確是問題所在。事實證明,無論如何我需要支持iOS6,所以我最終無法使用NSURLSession,但這是解決我的問題的方法。感謝您指出了這一點! – riemannnoodles

相關問題