使用MultipartAPI上载图像和字符串

时间:2016-10-28 08:50:28

标签: objective-c image file-upload

我想使用多部分数据上传图像和字符串 这是我的代码,

 +(void)UploadImageWithAlldetails:(NSDictionary *)string imageresource:(NSData *)imageResource andCompletion:(GFWebServiceHandler)completion
 {
 NSString *createNoteUrl=[NSString stringWithFormat:@"%@/%@",BASE_URL,API_TO_UPLOAD_IMAGE];

NSData *jsonData = [NSJSONSerialization dataWithJSONObject: string
                                                   options:0
                                                     error:nil];
NSString *jsonString =[[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:createNoteUrl]];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setHTTPShouldHandleCookies:NO];
[request setTimeoutInterval:60];
[request setHTTPMethod:@"POST"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];


NSString *boundary = @"unique-consistent-string";
//set conteent type in HTTP header

NSString *contentType = [NSString stringWithFormat:@"multipart/form-data;boundary=%@",boundary];
//[request setValue:contentType forHTTPHeaderField:@"Content-Type"];
[request addValue:contentType forHTTPHeaderField:@"Content_Type"];

NSMutableData *body =[NSMutableData data];

[body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary]dataUsingEncoding:NSUTF8StringEncoding]];


[body appendData:[[NSString stringWithFormat:@"Content-Disposition : form-data; name = %@\r\n\r\n",@"userDetails"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Type :application/octet-stream\r\n\r\n"]dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData:[[NSString stringWithFormat:@"%@\r\n",jsonString]
            dataUsingEncoding:NSUTF8StringEncoding]];


//image data

if (imageResource) {


    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=%@; filename=imageName.png\r\n", @"userImage"] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];



[body appendData:[NSData dataWithData:imageResource]];
[body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}

[body appendData:[[NSString stringWithFormat:@"--%@--\r\n",boundary ] dataUsingEncoding:NSUTF8StringEncoding]];

// set the content-length
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[body length]];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];

[request setHTTPBody:body];



  [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
    if(data.length > 0)
    {
        //success
        NSLog(@"%@",response);

        NSString *stringFromData = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

        NSLog(@"%@",stringFromData);


    }
}];

}

我已经实现了上面的代码,我从服务器获取json数据,我有nslog,它显示类似,res-type:error,msg:上传时出错。

请有人帮助我,做到这一点, 在此先感谢!!!

1 个答案:

答案 0 :(得分:0)

使用 AFNetWorking 上传图片

这是我的方式,希望这会有所帮助:)

NSMutableDictionary *params = [NSMutableDictionary dictionary];
NSString *urlString = [NSString stringWithFormat:@"%@mvs-itsm/%@",itsmUrl,@"attUpload"];
[params setObject:attchementID forKey:@"id"];
[params setObject:attType forKey:@"type"];

AFHTTPRequestSerializer *serializerReq = [AFHTTPRequestSerializer serializer];
serializerReq.timeoutInterval = 60.f;
[serializerReq setValue:@"multipart/form-data" forHTTPHeaderField:@"Content-Type"];
[serializerReq setValue:[NSString stringWithFormat:@"Basic %@", [MVSUserDefaults getToken]] forHTTPHeaderField:@"Authorization"];
//    [serializerReq setValue:@"gzip" forHTTPHeaderField:@"Content-Encoding"];
//    [serializerReq setValue:@"gzip, deflate" forHTTPHeaderField:@"Accept-Encoding"];
NSError *error;

NSMutableURLRequest *requset = [serializerReq multipartFormRequestWithMethod:@"POST" URLString:urlString parameters:params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
    [formData appendPartWithFileData:dataToUpload name:@"file" fileName:[NSString stringWithFormat:@"%@.%@",UUID(),@"jpg"] mimeType:type];
} error:&error];

AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
AFHTTPResponseSerializer *serializerRes = [AFHTTPResponseSerializer serializer];
manager.responseSerializer = serializerRes;

NSURLSessionUploadTask *datatask = [manager uploadTaskWithStreamedRequest:requset progress:progress completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
    //do your own work
}];
[datatask resume];