【问题标题】:How to upload large size of file by using AFNetworking如何使用 AFNetworking 上传大文件
【发布时间】:2016-11-28 17:46:50
【问题描述】:

我正在开发一个需要将文件上传到某个服务器的应用程序,并且我正在使用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 来实现吗?还是我也可以使用其他方法来实现这一点?

寻找建议。

谢谢

【问题讨论】:

  • 为您的概念使用多格式数据
  • 还要检查服务器是否有限制。如果服务器上设置了最大上传大小。
  • @AshishP。不,没有限制,正如我提到的那样,Android 人使用流来处理相同的大文件
  • 正如 API 文档中提到的那样,流的“Content-Type application/octet-stream”
  • 你的服务器有问题,别管那些可怜的 Android 家伙。你说有500? 服务器内部错误?

标签: ios objective-c xcode api afnetworking


【解决方案1】:

注意:- 我刚刚使用 AFNetworking 3.0 实现了图像上传服务,

-> 这里 kBaseURL 表示服务器的 Base URL

->serviceName 表示服务名称。

->dictParams 表示需要时给出参数,否则为零。

->image 表示传递你的图像。

注意:- 这段代码是用 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
}];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多