Загрузка UIImage с использованием запроса NSMutable - PullRequest
1 голос
/ 01 сентября 2010

Мне нужно отправить запрос. Запрос имеет 3 параметра: «email_id», «location» и «image_data». Значение для 'image_data' содержит jpeg представление NSData UIImage. Запрос должен быть отправлен с использованием типа содержимого multipart / form-data. Как я могу создать NSMutableRequest для публикации этого запроса? Как мне установить границу? Требуется ли граница для всего пакета или достаточно только для части изображения?

Ответы [ 3 ]

2 голосов
/ 01 сентября 2010

На вашем месте я бы проверил библиотеку ASIHTTPRequest. Это HTTP-клиентская библиотека для Cocoa, которая делает жизнь ВСЕГДА намного проще для людей, которые много общаются в Интернете из своих приложений для iPhone.

Вот я, использующий ASIFormDataRequest (компонент ASIHTTPRequest) для загрузки изображения из моего приложения для iPhone. Клиент называет эти изображения «отметками» - они наносятся на карту местных снимков, сделанных пользователями по всему региону. Пользователям предлагается «оставить свой след». Вы можете представить себе веселье, которое наступает.

Anyhoo, self.mark - это экземпляр моего класса Mark, который инкапсулирует данные о пакете с изображениями и подробностями, который я загружаю. У меня есть синглтон диспетчера данных, который я использую в первой строке этого метода, который содержит текущую CLLocation, поэтому я могу получить информацию о геокоде для этого изображения.

Заметьте, я не занимаюсь типами кодирования или составными границами. Библиотека обрабатывает все это.

-(void)completeUpload
{
    CLLocation *currentLoc = [DataManager sharedDataManager].currentLocation;
    self.mark.latitude = [NSNumber numberWithDouble:currentLoc.coordinate.latitude];
    self.mark.longitude = [NSNumber numberWithDouble:currentLoc.coordinate.longitude];

    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:
                                   [NSURL URLWithString:[NSString stringWithFormat:@"%@image_upload.php", WEBAPPURL]]];


    [request setPostValue:self.mark.titleText forKey:@"title"];
    [request setPostValue:self.mark.descriptionText forKey:@"description"];
    [request setPostValue:self.mark.event.guid forKey:@"event"];
    [request setPostValue:self.mark.latitude forKey:@"latitude"];
    [request setPostValue:self.mark.longitude forKey:@"longitude"];
    [request setPostValue:self.mark.project forKey:@"project"]; 
 [request setPostValue:[[NSUserDefaults standardUserDefaults] valueForKey:@"userID"] forKey:@"user_id"];
    request.timeOutSeconds = 120;

    int i = 1;
    for (NSString *tag in self.tags) {
        [request setPostValue:tag forKey:[NSString stringWithFormat:@"tag-%d", i]];
         i++;
    }

    NSData *imageData = UIImagePNGRepresentation(self.mark.image);
    NSData *thumbData = UIImagePNGRepresentation(self.mark.thumbnail);
    [request setData:imageData forKey:@"file"];
    [request setData:thumbData forKey:@"thumb"];

    self.progress.progress = 20.0;
    [request setUploadProgressDelegate:self.progress];
    request.showAccurateProgress = YES;

    request.delegate = self;
    [request startAsynchronous];
}

РЕДАКТИРОВАТЬ: Кстати, скрипт PHP, который я публикую, находится за HTTP-аутентификацией. ASI кэширует эти учетные данные, и я предоставил их ранее, поэтому мне не нужно предоставлять их здесь снова. Я отмечаю, что поскольку в противном случае способ написания этого поста и соответствующего сценария PHP может подделать любое значение идентификатора пользователя и опубликовать что угодно под своим именем пользователя. Вы должны думать о безопасности веб-приложений, когда создаете такое приложение, не отличающееся от того, было ли это веб-сайтом. На самом деле это веб-сайт, который просматривается через нетрадиционный клиент.

2 голосов
/ 21 сентября 2010
NSData *imageData=UIImageJPEGRepresentation(imageview.image, 1.0);
NSString *filename=@"nike.jpg"

NSString *urlString = @"http://xyz.com/file_upload/file1.php";
NSMutableURLRequest *request =[[[NSMutableURLRequest alloc] init] autorelease];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];

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

     NSMutableData *body = [NSMutableData data];
     NSMutableString * string = [[NSMutableString alloc] init];
    [string appendFormat:@"\r\n\r\n--%@\r\n", boundary];
    [string appendFormat:@"Content-Disposition: form-data; name=\"emailid\"\r\n\r\n"];
    [string appendFormat:@"pradz39@gmail.com"]; //value
    [body appendData:[string dataUsingEncoding:NSUTF8StringEncoding]]; // encrypt the entire body   

    [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",filename]] 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]];
    [string release];

    [request setHTTPBody:body];
    NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
    NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];
2 голосов
/ 01 сентября 2010

Эта ссылка:

http://iphone.zcentric.com/2008/08/29/post-a-uiimage-to-the-web/

Должна содержать все необходимое.Вам нужно будет расширить PHP-скрипт для обработки параметров, не относящихся к изображению, но это то, что я использовал.:)

Редактировать: Заметил, что предыдущая ссылка была сломана.Новый работает

...