【问题标题】:How to upload the images to server?如何将图片上传到服务器?
【发布时间】:2017-02-02 06:27:57
【问题描述】:
         NSMutableDictionary *files = [[NSMutableDictionary alloc] init];
           UIImage *imageFromImageView = userpic.image;

            NSData *data1 = UIImageJPEGRepresentation(imageFromImageView, 0.8);
            if ([data1 length]>0) {
                [files setValue:data1 forKey:@"photo"];
            }


    NSString *urlString =@"http://chkdin.com/dev/api/user/update_user?";
    NSURL *url = [NSURL URLWithString:urlString];

    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];

    NSString *parameterString=[NSString stringWithFormat:@"skey=%@&user_id=%@&first_name=%@&last_name=%@&designation=%@&company=%@&display_name=%@&photo=%@",@"XXXXXXXX",[[NSUserDefaults standardUserDefaults]objectForKey:@"UserId"],FirstNameString,LastNameString,DesignationString,OrganizationString,displayname,files];

    NSLog(@"%@",parameterString);

    [request setHTTPMethod:@"POST"];
    [request setURL:url];
    [request setValue:parameterString forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

    NSData *postData = [parameterString dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:postData];

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
    NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (error) {
            [activityIndicatorView stopAnimating];
        } else {
            NSLog(@"%@ %@", response, responseObject);
  }
      }];
    [dataTask resume];

这是我尝试过的代码,这里用户选择了我上传到服务器但图像没有上传的图像。在这里,用户选择的图像我转换为文件格式,然后我发送到服务器。你能帮我看看我的代码有什么问题吗?

【问题讨论】:

  • 问题/错误是什么?服务器没有收到这个文件的请求吗?或者文件没有​​转换为特定格式?告诉我们有关问题的更多信息
  • @SivaSankar:x-www-form-urlencoded 不支持文件上传。您应该使用multipart/form-data 将文件上传到服务器。检查stackoverflow.com/questions/24250475/…
  • 我将图像转换为文件格式,图像已转换但服务器不接受
  • 我有一个关于他回来的答案,请查看it here
  • 下载演示并查看:github.com/IosPower/WebserviceSwift3

标签: ios objective-c json image


【解决方案1】:

试试这个:

NSMutableDictionary *files = [[NSMutableDictionary alloc] init];
           UIImage *imageFromImageView = userpic.image;

            NSData *data1 = UIImageJPEGRepresentation(imageFromImageView, 0.8);
            if ([data1 length]>0) {
                [files setValue:data1 forKey:@"photo"];
            }


        NSString *Datestr = [self dateStringJPG];
        NSString *str=@"http://chkdin.com/dev/api/user/update_user?";

        NSString *parameterString=[NSString stringWithFormat:@"skey=%@&user_id=%@&first_name=%@&last_name=%@&designation=%@&company=%@&display_name=%@&photo=%@",@"sa6rw9er7twefc9a7dvcxcheckedin",[[NSUserDefaults standardUserDefaults]objectForKey:@"UserId"],FirstNameString,LastNameString,DesignationString,OrganizationString,displayname,files];

        NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
        NSString *BoundaryConstant = @"----------V2ymHFg03ehbqgZCaKO6jy";
        NSString* FileParamConstant = @"file";
        NSURL* requestURL = [NSURL URLWithString:str];
        request = [[NSMutableURLRequest alloc] init];
        [request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
        [request setHTTPShouldHandleCookies:NO];
        [request setTimeoutInterval:60];
        [request setHTTPMethod:@"PUT"];
        NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@", BoundaryConstant];
        [request setValue:contentType forHTTPHeaderField: @"Content-Type"];
        NSMutableData *body = [NSMutableData data];

        NSData *imageData = UIImageJPEGRepresentation(image, 0.5);
        if (imageData) {
            [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
            [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]];
            [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
            [body appendData:imageData];
            [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
        }
        [body appendData:[[NSString stringWithFormat:@"--%@--\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
   NSData *postData = [parameterString dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:postData];        
        NSString *postLength = [NSString stringWithFormat:@"%d", [body length]];
        [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
        [request setURL:requestURL];
        [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue currentQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
            if(data.length > 0)
            {
                NSLog(@"success jpg %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
            }
            else
            {
                NSLog(@"---xxerror %@-%@",data,error);
            }
        }];

【讨论】:

  • 这里的 dateStringJPG 是什么?
  • 你不用我用那个作为文件名
【解决方案2】:

您应该使用 multipart/form-data 将文件上传到服务器。试试这个:

NSMutableDictionary *params=[NSMutableDictionary dictionary];
[params setObject:@"sa6rw9er7twefc9a7dvcxcheckedin" forKey:@"skey"];
[params setObject:[[NSUserDefaults standardUserDefaults]objectForKey:@"UserId"] forKey:@"user_id"];
[params setObject:FirstNameString forKey:@"first_name"];
[params setObject:LastNameString forKey:@"last_name"];
[params setObject:DesignationString forKey:@"designation"];
[params setObject:OrganisationString forKey:@"company"];
[params setObject:displayname forKey:@"display_name"];

NSError *error = nil;

NSData *jsonData=[NSJSONSerialization dataWithJSONObject:params options:0 error:&error];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)[jsonData length]];

NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:@"http://chkdin.com/dev/api/user/update_user"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:180];

[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];

//Post value as form data

NSMutableData *body = [NSMutableData data];

NSString *boundary = @"---------------------------14737800031466499882746641949";
NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; charset=utf-8; boundary=%@", boundary];

[request addValue:contentType forHTTPHeaderField:@"Content-Type"];

[params enumerateKeysAndObjectsUsingBlock:^(NSString *parameterKey, NSString *parameterValue, BOOL *stop) {
   [body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
   [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", parameterKey] dataUsingEncoding:NSUTF8StringEncoding]];
   [body appendData:[[NSString stringWithFormat:@"%@\r\n", parameterValue] dataUsingEncoding:NSUTF8StringEncoding]];
}];

//Image upload part
UIImage *imageFromImageView = userpic.image;

NSData *dataImage = UIImageJPEGRepresentation(imageFromImageView, 0.8);

[body appendData:[[NSString stringWithFormat:@"--%@\r\n", boundary] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[[NSString stringWithFormat:@"Content-Disposition: attachment; name=\"photo\"; filename=\"%@\"\r\n",@"photoname"] dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:[@"Content-Type: image/jpg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
[body appendData:dataImage];
[body appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];

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

NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURLSessionDataTask *dataTask = [manager dataTaskWithRequest:request completionHandler:^(NSURLResponse *response, id responseObject, NSError *error) {
        if (error) {
            [activityIndicatorView stopAnimating];

        } else {
            NSLog(@"%@ %@", response, responseObject);
        }
}];
[dataTask resume];

【讨论】:

  • 抱歉回复晚了,这里的应用程序崩溃了 [body appendData:[NSData dataWithContentsOfFile:dataImage]];
  • [NSConcreteMutableData getFileSystemRepresentation:maxLength:]:无法识别的选择器发送到实例 0x170458f00'
  • @SivaSankar :请查看更新后的代码。实际上我忘了删除你崩溃的那部分。我错误地将NSData 转换为NSData。应该直接dataImage
【解决方案3】:
-(void)sendDataToServer
{
indicators.hidden=NO;
[indicators startAnimating];
 NSUserDefaults*defaults=[NSUserDefaults standardUserDefaults];

dict = [defaults objectForKey:@"Ucountry"];

NSMutableDictionary* _params = [[NSMutableDictionary alloc] init];
    [_params setObject:[dict objectForKey:@"id"]  forKey:@"userId"];

[_params setObject:@""  forKey:@"address"];
[_params setObject:txtCity.text  forKey:@"city"];
[_params setObject:@""  forKey:@"country"];
[_params setObject:txtemail.text  forKey:@"emailId"];
[_params setObject:txtFullName.text  forKey:@"firstName"];
[_params setObject:txtPhoneNumber.text  forKey:@"mobile"];
[_params setObject:txtState.text  forKey:@"state"];
[_params setObject:txtZipCode.text  forKey:@"zipcode"];


DLog(@"data=====>%@",_params);
[_params setObject:@"editprofile"  forKey:@"action"];


NSString *BoundaryConstant = @"----------V2ymHFg03ehbqgZCaKO6jy";
NSString* FileParamConstant = @"image";

NSURL* requestURL = [NSURL URLWithString:BaseURL];


// create request
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setCachePolicy:NSURLRequestReloadIgnoringLocalCacheData];
[request setHTTPShouldHandleCookies:NO];
[request setTimeoutInterval:30];
[request setHTTPMethod:@"POST"];

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

// post body
NSMutableData *body = [NSMutableData data];

// add params (all params are strings)
for (NSString *param in _params)
{
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n", param] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"%@\r\n", [_params objectForKey:param]] dataUsingEncoding:NSUTF8StringEncoding]];
}

// add image data
if (imageData) {
    [body appendData:[[NSString stringWithFormat:@"--%@\r\n", BoundaryConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"; filename=\"image.jpg\"\r\n", FileParamConstant] dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:[@"Content-Type: image/jpeg\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
    [body appendData:imageData];
    [body appendData:[[NSString stringWithFormat:@"\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
}

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

// setting the body of the post to the reqeust
[request setHTTPBody:body];

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

NSURLResponse *response = nil;
NSError *requestError = nil;

NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&requestError];


if (requestError == nil)
{

    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:returnData options:kNilOptions error:&requestError];

    dict=json;
    DLog(@"data=====>%@",dict);

    if ([[dict objectForKey:@"status"] isEqualToString:@"Success"]==TRUE)
    {
        [hud hideAnimated:YES];


        NSUserDefaults *defUser = [NSUserDefaults standardUserDefaults];
        [defUser setObject:[dict objectForKey:@"response"]forKey:@"Ucountry"];
        [defUser synchronize];

        UIStoryboard*storyboard=[AppDelegate storyBoardType];
        DashboardVC*dsvc=(DashboardVC*)[storyboard instantiateViewControllerWithIdentifier:@"DashboardVCId"];
        [self.navigationController pushViewController:dsvc animated:YES];
                }else{
                    [hud hideAnimated:YES];

    }
}
}
 -(void)Open_Camera{

#if TARGET_IPHONE_SIMULATOR

NSLog(@"No Camera is set up in Simulator");

#else

UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypeCamera;
[self presentViewController:picker animated:YES completion:NULL];

#endif

}

-(void)Open_Library{

UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];

imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
imagePicker.delegate=self;
imagePicker.navigationBar.tintColor=[UIColor whiteColor];
imagePicker.allowsEditing = YES;

if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad)
{
    [self presentViewController:imagePicker animated:YES completion:nil];
}
else{
    [self presentViewController:imagePicker animated:YES completion:nil];
}
}

-(void)selectphoto{
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
picker.delegate = self;
picker.allowsEditing = YES;
picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:picker animated:YES completion:NULL];
}
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {


   UIImage *img =   [info objectForKey:UIImagePickerControllerOriginalImage];
imgView.image =img;
NSLog(@"image user png is -----<%@",imgView.image);

if(imgView==nil)
{
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"OOPS" message:@"No Image Foundy "
                                                                      preferredStyle:UIAlertControllerStyleAlert];

    UIAlertAction *actionOk = [UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:nil];
    [alertController addAction:actionOk];
    [self presentViewController:alertController animated:YES completion:nil];

}
else
{
    imageData=[self compressImage:img];

    [picker dismissViewControllerAnimated:YES completion:nil];

}
return;

}

- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

[picker dismissViewControllerAnimated:YES completion:NULL];

}

-(NSData *)compressImage:(UIImage *)image1 {

float actualHeight = image1.size.height;
float actualWidth = image1.size.width;
float maxHeight = 500.0;
float maxWidth = 500.0;
float imgRatio = actualWidth/actualHeight;
float maxRatio = maxWidth/maxHeight;
float compressionQuality = 0.5;

if(imgRatio < maxRatio){

    imgRatio = maxHeight / actualHeight;
    actualWidth = maxWidth;
    actualHeight = maxHeight;
}
else if(imgRatio > maxRatio){

    imgRatio = maxWidth / actualWidth;
    actualHeight = maxHeight;
    actualWidth = maxWidth;
}
else{
    actualHeight = maxHeight;
    actualWidth = maxWidth;
}
CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight);
UIGraphicsBeginImageContext(rect.size);
[image1 drawInRect:rect];
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
imageData = UIImageJPEGRepresentation(img, compressionQuality);
UIGraphicsEndImageContext();

return imageData;
}
-(IBAction)actionSheetForCameraAndGalleryClick:(id)sender{
    UIAlertController*alertAction=[UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];

    UIAlertAction *action=[UIAlertAction actionWithTitle:@"Camera" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){

        [self Open_Camera];
    }];


    UIAlertAction *action1=[UIAlertAction actionWithTitle:@"Gallery" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){

        [self Open_Library];
    }];


    UIAlertAction *cancelAlert=[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action){


        [self dismissViewControllerAnimated:YES completion:nil];
    }];


    [alertAction addAction:action];
    [alertAction addAction:action1];
    [alertAction addAction:cancelAlert];

    [self presentViewController:alertAction animated:YES completion:nil];
}
- (IBAction)CameraOpena:(id)sender {

[self Open_Camera];
}

- (IBAction)GalleryOpen:(id)sender {

[self Open_Library];
}

【讨论】:

    【解决方案4】:

    这样写一个api请求方法,使用Afnetworking...

    -(void)apiRequestImageUploadWithCompleteBlock:(NSString *)methodName methodParameters:(NSDictionary *)methodParameters imageName:(NSString *)imageName uploadImageData:(NSData *)uploadImageData inputParameters:(NSDictionary *)inputParameters completeBlock:(RTDictionaryResponseBlock)completeBlock failBlock:(RTFailBlock)failBlock
    {
        AFHTTPSessionManager *session = [AFHTTPSessionManager manager];
        //AFHTTPSessionManager *session = [[AFHTTPSessionManager alloc]initWithSessionConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration]];
        session.requestSerializer = [AFJSONRequestSerializer serializer];
        [session.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    
        //--------------------------------------------------------------------------------------
    NSString *URL_String = [NSString stringWithFormat:@"%@",baseUrl];
    
            NSDictionary *params = @{
                                     @"securitykey”:@“”,
                                     @"fc":@"",
                                     @"module":@""
                                     };
    
            NSMutableDictionary *dict_parameters=[params mutableCopy];
            [dict_parameters addEntriesFromDictionary:inputParameters];
    
            //Add method parameters
            [dict_parameters addEntriesFromDictionary:methodParameters];
    
    
    
            [session POST:URL_String parameters:dict_parameters constructingBodyWithBlock:^(id<AFMultipartFormData>  _Nonnull formData) {
    
                [formData appendPartWithFileData:uploadImageData name:@"image" fileName:imageName mimeType:@"image/png"];
    
            } progress:^(NSProgress * _Nonnull uploadProgress) {
    
            } success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
    
                NSDictionary *dataObj = (NSDictionary *)responseObject;
    
                completeBlock(dataObj);
    
            } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
    
                NSLog(@"%s :%@",__PRETTY_FUNCTION__,error.description);
    
                failBlock();
            }];
       }     
    

    【讨论】:

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