如何通过使用AFNetworking上传大尺寸的文件
问题描述:
我正在研究一个应用程序,我需要将文件上传到某个服务器,并且我正在使用AFNetworking
来上传文件。如何通过使用AFNetworking上传大尺寸的文件
所有的工作正常,除非文件大小像2mb一样短,如果超过这个,服务器回应我错误状态码500,不上传文件。
下面是代码我如何上传。
[request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:lang forHTTPHeaderField:@"Accept-Language"];
[request setValue:authVal forHTTPHeaderField:@"authorization"];
[request setValue:[headerParams objectForKey:@"x-file-name"] forHTTPHeaderField:@"x-file-name"];
[request setValue:[headerParams objectForKey:@"x-convert-document"] forHTTPHeaderField:@"x-convert-document"];
[request setValue:[headerParams objectForKey:@"x-source"] forHTTPHeaderField:@"x-source"];
//convert parameters in to json data
if ([params isKindOfClass:[NSDictionary class]]) {
NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:params
options:NSJSONWritingPrettyPrinted
error:&error];
jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
[request setURL:[NSURL URLWithString:action]];
[request setTimeoutInterval:200.0];
[request setHTTPMethod:@"POST"];
NSMutableData *postBody = [NSMutableData data];
[postBody appendData:[jsonString dataUsingEncoding:NSUTF8StringEncoding]];
[request setHTTPBody:imageData];
NSLog(@"File size is : %.2f MB",(float)imageData.length/1024.0f/1024.0f);
AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc]initWithRequest:request];
operation.responseSerializer = [AFJSONResponseSerializer serializer];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
NSInteger statusCode = [operation.response statusCode];
NSNumber *statusObject = [NSNumber numberWithInteger:statusCode];
successBlock(responseObject, statusObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
}
的代码[request setHTTPBody:imageData];
该生产线设置图像的NSData
。
同样的事情在Android上工作,它的工作正常,但他们使用流,首先将文件写入物理路径,然后通过使用流上传。这可能通过使用AFNetworking
?或者我可以通过使用其他方法来实现吗?
寻找建议。
感谢
答
注: - 我刚才已经实现并采用AFNetworking 3.0图片上传服务,
- >在这里kBaseURL意味着服务器的基本URL
- >服务名是指服务的名称。
- > dictParams表示如果需要,给出参数,否则为零。
- >图像意味着传递你的图像。
注意: - 这个代码写在NSObject类,我们已经应用在我们的项目。
+ (void)requestPostUrlWithImage: (NSString *)serviceName parameters:(NSDictionary *)dictParams image:(UIImage *)image success:(void (^)(NSDictionary *responce))success failure:(void (^)(NSError *error))failure {
NSString *strService = [NSString stringWithFormat:@"%@%@",kBaseURL,serviceName];
[SVProgressHUD show];
NSData *fileData = image?UIImageJPEGRepresentation(image, 0.5):nil;
NSError *error;
NSMutableURLRequest *request = [[AFHTTPRequestSerializer serializer] multipartFormRequestWithMethod:@"POST" URLString:strService parameters:dictParams constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
if(fileData){
[formData appendPartWithFileData:fileData
name:@"image"
fileName:@"img.jpeg"
mimeType:@"multipart/form-data"];
}
} error:&error];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
NSURLSessionUploadTask *uploadTask;
uploadTask = [manager uploadTaskWithStreamedRequest:request progress:^(NSProgress * _Nonnull uploadProgress) {
NSLog(@"Wrote %f", uploadProgress.fractionCompleted);
}
completionHandler:^(NSURLResponse * _Nonnull response, id _Nullable responseObject, NSError * _Nullable error) {
[SVProgressHUD dismiss];
if (error)
{
failure(error);
}
else
{
NSLog(@"POST Response : %@",responseObject);
success(responseObject);
}
}];
[uploadTask resume];
}
- >现在在我们的项目中应用。
UIImage *imgProfile = //Pass your image.
[WebService requestPostUrlWithImage:@"saveImageWithData" parameters:nil image:imgProfile success:^(NSDictionary *responce) {
NSString *check = [NSString stringWithFormat:@"%@",[responce objectForKey:@"status"]];
if ([check isEqualToString: @"1"]) {
//Image Uploaded.
}
else
{
//Failed to Upload.
}
} failure:^(NSError *error) {
//Error
}];
为您的概念使用多种数据 –
同时检查服务器是否有限制。如果在服务器上设置最大上传大小。 –
@AshishP。没有没有限制,正如我提到的Android人使用流 – Aleem