我无法理解为什么这么难。所有在线教程和文章似乎都在谈论1.0 api,这是非常无用的。
我尝试了几种不同的方法并获得了不同的结果。我做错了什么?
上传任务 - 这似乎没有使用多部分表格,wtf?
NSMutableURLRequest *request = [self.manager.requestSerializer multipartFormRequestWithMethod:@"POST"
URLString:[[NSURL URLWithString:url relativeToURL:[NSURL URLWithString:ApiBaseUrl]] absoluteString]
parameters:@{}
constructingBodyWithBlock:nil];
NSProgress *progress;
NSURLSessionUploadTask *task = [self.manager uploadTaskWithRequest:request
fromData:data
progress:&progress
completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
if (error) {
NSLog(@"[error description] = %@", [error description]);
} else {
NSLog(@"success!");
}
}];
[task resume];
发布一个块 - 这似乎没有附加任何内容
[self.manager POST:url
parameters:@{}
constructingBodyWithBlock:^(id <AFMultipartFormData> formData) {
[formData appendPartWithFileData:data
name:@"post[picture]"
fileName:@"picture.jpg"
mimeType:@"image/jpeg"];
}
success:^(NSURLSessionDataTask *task, id response) {
NSLog(@"Success");
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"Error: %@", error);
}];
简单的帖子 - 这似乎几乎可以工作......但不是
[self.manager POST:url
parameters:@{@"post[picture][]":data}
success:^(NSURLSessionDataTask *task, id response) {
NSLog(@"Success");
}
failure:^(NSURLSessionDataTask *task, NSError *error) {
NSLog(@"Error: %@", error);
}];
我希望1能够工作,但我不确定为什么不工作。
答案 0 :(得分:14)
对于正确形成的“multipart / form-data”主体,您需要在创建请求时使用body构造块。否则,上载任务将使用原始数据作为正文。例如,在AFHTTPSessionManager子类中:
NSString *urlString = [[NSURL URLWithString:kPhotoUploadPath relativeToURL:self.baseURL] absoluteString];
NSMutableURLRequest *request = [self.requestSerializer multipartFormRequestWithMethod:@"POST" URLString:urlString parameters:params constructingBodyWithBlock:^(id <AFMultipartFormData> formData) {
[formData appendPartWithFileData:photo.data name:@"photo" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
}];
NSURLSessionUploadTask *task = [self uploadTaskWithStreamedRequest:request progress:progress completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
if (error) {
if (failure) failure(error);
} else {
if (success) success(responseObject);
}
}];
[task resume];
或者,如果您不需要跟踪上传进度,只需使用:
[self POST:kPhotoUploadPath parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
[formData appendPartWithFileData:photo.data name:@"photo" fileName:@"photo.jpg" mimeType:@"image/jpeg"];
} success:^(NSURLSessionDataTask *task, id responseObject) {
if (success) success(responseObject);
} failure:^(NSURLSessionDataTask *task, NSError *error) {
if (failure) failure(error);
}];
答案 1 :(得分:5)
Ray Lillywhite描述的作品非常合适(我会对他的帖子发表评论,但我的名声太低了。)
NSMutableURLRequest
的帮助下创建multipartFormRequestWithMethod:URLString:parameters:constructingBodyWithBlock:error:
。
appendPartWith...
方法之一构建表单数据。uploadTaskWith...
方法获取(上传)数据任务。如果要使用uploadTaskWithStreamedRequest:progress:completionHandler:
输入参数,则需要使用NSProgress
。