web-dev-qa-db-ja.com

iOSからPHPサーバーに画像をアップロードする

この質問も以前に尋ねられたことは知っていますが、私の問題は少し異なります。

PHPサーバーに画像をアップロードし、iOSから画像とともにさらにパラメーターを送信したい。グーグルで検索して、2つの解決策を見つけた。

  1. JSONBase64エンコードされた文字列として画像を送信するか、どちらかです。参照 リンク

  2. または、フォームデータを使用してサーバーに画像をアップロードします。私はこれを参照しました link 。誰かが私をこのように呼んでくれたら、このAPIにパラメーターを追加するのを手伝ってください。

私の質問は、サーバーに画像をアップロードする最良の方法であり、同じWebサービス呼び出しでより多くのパラメーター(ユーザー名、パスワード、および詳細)を送信する必要があることです。

前もって感謝します。

20
Vinay Jain

次の2つの方法で、iOSアプリからPHP serverに画像をアップロードできます。

を使用新しいAFNetworking

#import "AFHTTPRequestOperation.h"
#import "AFHTTPRequestOperationManager.h"

    NSString *stringUrl =@"http://www.myserverurl.com/file/uloaddetails.php?"
    NSString *string =@"http://myimageurkstrn.com/img/myimage.png"       
    NSURL *filePath = [NSURL fileURLWithPath:string];

   NSDictionary *parameters  = [NSDictionary dictionaryWithObjectsAndKeys:userid,@"id",String_FullName,@"fname",String_Email,@"emailid",String_City,@"city",String_Country,@"country",String_City,@"state",String_TextView,@"bio", nil];

    AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];

    [manager POST:stringUrl parameters:parameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData)
     {
         [formData appendPartWithFileURL:filePath name:@"userfile" error:nil];//here userfile is a paramiter for your image 
     }
     success:^(AFHTTPRequestOperation *operation, id responseObject)
     {
         NSLog(@"%@",[responseObject valueForKey:@"Root"]);
         Alert_Success_fail = [[UIAlertView alloc] initWithTitle:@"myappname" message:string delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
         [Alert_Success_fail show];     

     }
     failure:^(AFHTTPRequestOperation *operation, NSError *error)
     {
         Alert_Success_fail = [[UIAlertView alloc] initWithTitle:@"myappname" message:[error localizedDescription] delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil, nil];
         [Alert_Success_fail show];

     }];

2番目に使用するNSURLConnection:

-(void)uploadImage
    {       
        NSData *imageData = UIImagePNGRepresentation(yourImage);

        NSString *urlString = [ NSString stringWithFormat:@"http://yourUploadImageURl.php?intid=%@",1];

        NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
        [request setURL:[NSURL URLWithString:urlString]];
        [request setHTTPMethod:@"POST"];

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

        NSMutableData *body = [NSMutableData data];
        [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithString:[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"userfile\"; filename=\"%@\"\r\n", 1]] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
        [body appendData:[NSData dataWithData:imageData]];
        [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSUTF8StringEncoding]];
        [request setHTTPBody:body];

        [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    }

アプリからphpサーバーに画像をアップロードするためのこの両方の方法は、これがあなたに役立つことを願っています。

38
Nitin Gohel

Restkitで試す

ここにリンクがあります パラメータ付きのレストキット画像のアップロード

ここからRestkitのヘルプを入手できます Restkitの統合手順

0
korat prashant

これを試してみてください、これは私の仕事です。

    NSData *postData = [Imagedata dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
    NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    [request setURL:[NSURL URLWithString:apiString]];
    [request setHTTPMethod:@"POST"];
    [request setValue:postLength forHTTPHeaderField:@"Content-Length"];
    [request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
    [request setHTTPBody:postData];

    NSURLResponse *response;
    NSError *err;
    NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding: NSUTF8StringEncoding];


    NSError *jsonError;
    NSData *objectData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
    NSDictionary *responseDictft = [NSJSONSerialization JSONObjectWithData:objectData
                                                                   options:NSJSONReadingMutableContainers
                                                                     error:&jsonError];
0
kalpesh

これを試して。

-(void)EchoesPagePhotosUpload
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{

    [self startIndicator];
});
//NSLog(@"%@",uploadPhotosArray);
NSMutableArray *uploadPhotosByteArray=[[NSMutableArray alloc] init];
conversionImage= [UIImage imageWithContentsOfFile:[uploadPhotosArray objectAtIndex:0]];

NSLog(@"conversionImage.size.height %f",conversionImage.size.height);
NSLog(@"conversionImage.size.width %f",conversionImage.size.width);
if(conversionImage.size.height>=250&&conversionImage.size.width>=250)
{
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        [self performSelectorInBackground: @selector(LoadForLoop) withObject: nil];        NSLog(@"conversionImage.size.height %f",conversionImage.size.height);
        NSLog(@"conversionImage.size.width %f",conversionImage.size.width);

        for(int img_pos=0;img_pos<[uploadPhotosArray count];img_pos++)
        {
            conversionImage= [UIImage imageWithContentsOfFile:[uploadPhotosArray objectAtIndex:img_pos]];
            NSData *imageData = UIImageJPEGRepresentation(conversionImage,1.0);
            [Base64 initialize];
            NSString *uploadPhotoEncodedString = [Base64 encode:imageData];
            //NSLog(@"Byte Array %d : %@",img_pos,uploadPhotoEncodedString);
            [uploadPhotosByteArray addObject:uploadPhotoEncodedString];

        }
        dispatch_async(dispatch_get_main_queue(), ^{
            NSString *photo_description=[webview stringByEvaluatingJavaScriptFromString:                        @"document.getElementById('UploadPicsDesc').value"];
            NSString *uploadPhotoImageName=@"uploadPhoto.jpg";
            NSDictionary *UploadpicsJsonResponseDic=[WebserviceViewcontroller EchoesUploadPhotos:profileUserId imageName:uploadPhotoImageName Image:uploadPhotosByteArray PhotoDescription:photo_description];
            //NSLog(@"%@",UploadpicsJsonResponseDic);
            NSString *UploadPhotosStatusString=[UploadpicsJsonResponseDic valueForKey:@"Status"];

            NSLog(@"UploadPhotosStatusString :%@",UploadPhotosStatusString);
            NSString *uploadPhotosCallbackstring=[NSString stringWithFormat:@"RefreshForm()"];
            [webview stringByEvaluatingJavaScriptFromString:uploadPhotosCallbackstring];
        });
    });
}
else {
    UIAlertView *ErrorAlert=[[UIAlertView alloc] initWithTitle:@"Error" message:@"Please Upload Photo Above 250x250 size" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [ErrorAlert show];
    NSLog(@"conversionImage.size.height %f",conversionImage.size.height);
    NSLog(@"conversionImage.size.width %f",conversionImage.size.width);
}
}

AFNetworking を使用すると、次のようになります。

NSMutableDictionary *params = [[NSMutableDictionary alloc]init];
    [params setObject:@"myUserName" forKey:@"username"];
    [params setObject:@"1234" forKey:@"password"];
    [[AFHTTPRequestOperationLogger sharedLogger] startLogging];
    NSData *imageData;
    NSString *urlStr = [NSString stringWithFormat:@"http://www.url.com"];
    NSURL *url = [NSURL URLWithString:urlStr];

    AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:url];
       imageData = UIImageJPEGRepresentation(mediaFile, 0.5);


    NSMutableURLRequest *request = [httpClient multipartFormRequestWithMethod:@"POST" path:nil parameters:params constructingBodyWithBlock: ^(id <AFMultipartFormData>formData)
    {
              [formData appendPartWithFileData:imageData name:@"mediaFile" fileName:@"picture.png" mimeType:@"image/png"];
    }];

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request

    success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
    {

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"File was uploaded" message:@""
                                                       delegate:self cancelButtonTitle:@"Close" otherButtonTitles: nil];
        [alert show];
    }
    failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON)
    {
        NSLog(@"request: %@",request);
        NSLog(@"Failed: %@",[error localizedDescription]);
    }];


    [operation setUploadProgressBlock:^(NSUInteger bytesWritten, long long totalBytesWritten, long long totalBytesExpectedToWrite)
    {
        NSLog(@"Sent %lld of %lld bytes", totalBytesWritten, totalBytesExpectedToWrite);
    }];
    [httpClient enqueueHTTPRequestOperation:operation];
0
Segev
-(void)uploadImage
{

NSString *mimetype = @"image/jpeg";
NSString *myimgname = _txt_fname.text; //@"img"; //upload image with this name in server PHP FILE MANAGER
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *imageDataa = UIImagePNGRepresentation(chooseImg.image);
NSDictionary *parameters =@{@"fileimg":defaults }; //@{@"uid": [uidstr valueForKey:@"id"]};

AFHTTPRequestSerializer *serializer = [AFHTTPRequestSerializer serializer];
//here post url and imagedataa is data conversion of image  and fileimg is the upload image with that name in the php code
NSMutableURLRequest *request =
[serializer multipartFormRequestWithMethod:@"POST" URLString:@"http://posturl/newimageupload.php"
                                parameters:parameters
                 constructingBodyWithBlock:^(id<AFMultipartFormData> formData) {
                     [formData appendPartWithFileData:imageDataa
                                                 name:@"fileimg"
                                             fileName:myimgname
                                             mimeType:mimetype];
                 }];

AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//manager.responseSerializer = [AFHTTPResponseSerializer serializer];
AFHTTPRequestOperation *operation =
[manager HTTPRequestOperationWithRequest:request
                                 success:^(AFHTTPRequestOperation *operation, id responseObject) {
                                     NSLog(@"Success %@", responseObject);
                                     [uploadImgBtn setTitle:@"Uploaded" forState:UIControlStateNormal];
                                     [chooseImg setImage:[UIImage imageNamed:@"invoice-icon.png"]];

                                     if([[responseObject objectForKey:@"status"] rangeOfString:@"Success"].location != NSNotFound)
                                     {
                                         [self alertMsg:@"Alert" :@"Upload sucess"];
                                     }

                                 } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                                     NSLog(@"Failure %@", error.description);
                                     [chooseImg setImage:[UIImage imageNamed:@"invoice-icon.png"]];
                                     uploadImgBtn.enabled = YES;

                                 }];

// 4. Set the progress block of the operation.
[operation setUploadProgressBlock:^(NSUInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) {

    float myprog = (float)totalBytesWritten/totalBytesExpectedToWrite*100;
    NSLog(@"Wrote %f ", myprog);
}];

// 5. Begin!
[operation start];

}
0
razesh