2016-07-25 97 views
0

我正在研究一个应用程序,我需要将文件上传到某个服务器,并且我正在使用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?或者我可以通过使用其他方法来实现吗?

寻找建议。

感谢

+0

为您的概念使用多种数据 –

+1

同时检查服务器是否有限制。如果在服务器上设置最大上传大小。 –

+0

@AshishP。没有没有限制,正如我提到的Android人使用流 – Aleem

回答

0

注: - 我刚才已经实现并采用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 
}];